我正在尝试创建一个可以创建个性化标签的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或'$'。
答案 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中对变量名称无效。