0

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

多亏了正则表达式,我已经完成了所有我需要的工作而没有特别的问题,但是当我尝试创建一个指向指定 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] & [url= http://ciao.com]ciao[/url]

但是我对像 last.fm 样式的特殊 url 主题页面的情况有些问题,所以 [artist]Lemon Jelly[/artist]。

bblink 在 <a href="http://ciao.com/artist/Lemon Jelly"> Lemon Jelly</a>中转换(我使用空格 <a> 只是为了显示链接代码)。
该链接在 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 部分,但用“+”代替“”空白字符,所以[artist]Lemon Jelly[/artist]应该变成<a href="http://ciao.com/artist/Lemon+Jelly">柠檬果冻</a>

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

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

错误类型是 PHP Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in /...

4

4 回答 4

2

请提供有错误的行前后的 2-3 行(行号应在 PHP 解析错误中。

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

我对SO很陌生,为什么我不能评论这个问题来问这个(因为我写的并不是真正的答案)

于 2009-12-11T18:20:31.237 回答
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 客户端。修复了正则表达式。有用 :)

于 2009-12-11T18:30:31.547 回答
0

为了避免这种情况,我编写了一小部分代码,用相同的 url 更改了 href url 部分,但用“+”代替了“”

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

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

于 2009-12-11T18:26:17.247 回答
0

I believe the problem is with the $1 reference, which is used in the str_replace function outside of the preg_replace arguments. The $1 backreference only works within the confines of preg_replace arguments, so you can't pass it like a variable to str_replace; it tries to use $1 as a variable, but in PHP that is invalid for a variable name.

于 2009-12-11T18:45:24.680 回答