PHP语法上的错误preg_replace方法
-
19-09-2019 - |
题
我在尝试做一个设置高亮parser类,可以创建personalyzed标签,但是我有一些问题的网址
我已经做了所有我需要没有特别的问题由于经常表达的但我有一个问题时,我尝试创建一个特殊的标记,谁点的指定的网址。
在我的课我已经增加了一个方法是这样的:
<?
private function check_url_from_bbcode ($tag = "url", $css = null, $url_path = null) {
$regex_url = " a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'";
if (!isset ($css)) $css = $this->css_link;
$regex_url = $this->regex_url;
if (isset ($url_path)) $url_path = "$url_path/";
$this->bbcode = preg_replace ("/\[$tag\]([$regex_url]*)\[\/$tag\]/", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$1</a>", $this->bbcode);
$this->bbcode = preg_replace ("(\[$tag\=([$regex_url]*)\](.+?)\[/$tag\])", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$2</a>", $this->bbcode);
}
?>
代码工作的现有经典的网址[url]http://ciao.com[/url] &[url=http://ciao.com]再见[/url]
但是我有一些问题的情况下,一个特殊的网址主页的最后一次。fm风格,所以[艺术家]柠檬果冻[/艺术家].
该bblink转换中 < a href="http://ciao.com/artist/Lemon 果冻">柠檬果冻< /一个> (我已经使用的空间 < 一只显示的链接码)。
链接的空格上href属性,因此不可能永远不会的工作。
<?
private function check_url_from_bbcode ($tag = "url", $css = null, $url_path = null) {
$regex_url = " a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'";
if (!isset ($css)) $css = $this->css_link;
$regex_url = $this->regex_url;
if (isset ($url_path)) $url_path = "$url_path/";
// begin of the problem
$this->bbcode = preg_replace ("/\[$tag\]([$regex_url]*)\[\/$tag\]/", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path".str_replace (" ", "+", $1)."\">$1</a>", $this->bbcode);
// end of the problem
$this->bbcode = preg_replace ("(\[$tag\=([$regex_url]*)\](.+?)\[/$tag\])", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$2</a>", $this->bbcode);
}
?>
为了避免这一点,我已经写了一个小小的一部分代码的更改href url部与tha同一网址,但与"+"代替""空字符,所以 [艺术家]柠檬果冻[/艺术家] 应该成为 < a href="http://ciao.com/artist/Lemon+Jelly">柠檬果冻< /一个>
我没有经历过与PHP我不知道问题是什么,我已经使用这种语法在其他情况下,没有遇到问题。
有人可以帮我找我在哪里错了吗?
错误类型是PHP分析错误:语法错误,意想不到的T_LNUMBER,期待T_VARIABLE或'$'在/...
解决方案
解析错误的原因是 $1
不是有效的 PHP 变量名。它们必须以字母或下划线开头。这 $1
变量填充在 preg_replace
参数只在参数内部有效。
尝试更多类似这样的事情:
$this->bbcode = preg_replace("/\[$tag\]([$regex_url]*)\[\/$tag\]/e", "'<a title=\"Vai al link\" class=\"$css\" href=\"$url_path'. str_replace(' ', '+', '$1'). '\">$1</a>'", $this->bbcode);
这 e
修饰符将替换字符串计算为 PHP 代码,因此应该生成您想要的字符串。
请注意,我现在无法对其进行测试,因此您可能需要对其进行一些调整。对不起 :]
编辑 没关系,我有一个 FTP 客户端。修复了正则表达式。有用 :)
其他提示
请提供有错误的行之前和之后的2-3行(行号应该在PHP解析错误中。
这听起来不像正则表达式问题......更像是一个逃避的问题。
我对SO很陌生,为什么我不能直接评论这个问题来问这个问题(因为我写的并不是真正的答案)
为了避免这一点,我已经写了一个小小的 一部分代码的更改href url 部分与tha同一网址,但与"+" 在地""
为什么不用 urlencode
在内容标签?
注意urlencode只应当用于查询参数;实际目录的组成应该使用 rawurlencode
, 如HTTP本身并不使用,而不是空间。
我相信问题出在 $1 引用上,该引用用于 str_replace
函数之外的 preg_replace
论据。$1 反向引用仅在以下范围内有效 preg_replace
参数,所以你不能像变量一样将它传递给 str_replace
;它尝试使用 $1 作为变量,但在 PHP 中这对于变量名是无效的。