preg_replace方法的PHP语法错误

时间:2009-12-11 18:12:14

标签: php regex preg-replace bbcode str-replace

我正在尝试创建一个可以创建个性化标签的bbcode解析器类,但是我对网址有一些问题

由于正则表达式,我已经完成了所有我需要的而没有特殊问题,但是当我尝试创建指向指定URL的特殊标记时,我遇到了问题。

在我班上我添加了一个这样的方法:

<?
    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]&amp; [URL = http://ciao.com]ciao[/url]

但是我有一个特殊网址主题页面作为last.fm风格的问题,所以[艺术家]柠檬果冻[/艺术家]。

bblink转换为&lt; a href =“http://ciao.com/artist/Lemon Jelly”&gt; Lemon Jelly&lt; / a&gt; (我使用空格&lt; a&gt;仅显示链接代码)。
该链接在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);
    }
?>

为了避免这种情况,我编写了一小部分代码,用相同的url更改了href url部分,但用“+”代替“”whitespace char,所以 [artist] Lemon Jelly [/艺术家] 应该成为&lt; a href =“http://ciao.com/artist/Lemon+Jelly”&gt; Lemon Jelly&lt; / A&GT;

我对PHP没有经验,我不确定是什么问题,我在其他情况下使用这种语法而没有遇到问题。

有人可以帮我找到我错的地方吗?

错误类型是PHP Parse错误:语法错误,意外T_LNUMBER,在/...期待T_VARIABLE或'$'。

4 个答案:

答案 0 :(得分:2)

请在出现错误的行之前和之后提供2-3行(行号应该在PHP解析错误中。

这听起来不像正则表达式问题......更像是一个逃避问题。

我对SO很新,为什么我不能只是问这个问题(因为我写的不是真正的答案)

答案 1 :(得分:1)

解析错误是由于$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 :(得分:0)

  

为了避免这种情况,我写了一点   更改href url的代码的一部分   具有相同网址但带有“+”的部分   代替“”

为什么不在标签的内容上使用urlencode

请注意,urlencode只能用于查询参数;实际的目录组件应该使用rawurlencode,因为HTTP本身不使用+而不是空格。

答案 3 :(得分:0)

我认为问题在于$ 1引用,它在str_replace参数之外的preg_replace函数中使用。 $ 1反向引用只能在preg_replace个参数的范围内工作,所以你不能像变量一样将它传递给str_replace;它试图使用$ 1作为变量,但在PHP中对变量名称无效。