在CMS中发布如下格式的链接:
[url=http://www.examplesite.eu]ExampleSite[/url]
标题描述是url而不是linktext。 (linktext的= ExampleSite)
html输出如下:
<a href="http://www.examplesite.eu" title="http://www.examplesite.eu">http://www.examplesite.eu</a>
应该是:
<a href="http://www.examplesite.eu" title="ExampleSite">ExampleSite</a>
所以我用url_bbcode_include.php进行了实验,可以改变bbcode的行为。
原文,请注意标题=部分:
$text = preg_replace('#\[url=([\r\n]*)(http://|ftp://|https://|ftps://)([^\s\'\"]*?)\](.*?)([\r\n]*)\[/url\]#si', '<a href=\'\2\3\' target=\'_blank\' title=\'\2\3\'>\4</a>', $text);
修改为将linktext显示为标题,请注意title = part:
$text = preg_replace('#\[url=([\r\n]*)(http://|ftp://|https://|ftps://)([^\s\'\"]*?)\](.*?)([\r\n]*)\[/url\]#si', '<a href=\'\2\3\' target=\'_blank\' title=\'\4\'>\4</a>', $text);
修改后的url_bbcode_include.php效果非常好,但在使用颜色或其他html元素格式化linktext时会出现问题。然后标题部分包含像<span style=
这样的html,并且会破坏链接的正确显示。
所以我尝试在title = part中的strip_tags,但我无法让它工作。还探讨了strip_tags($ text);但这也是从linktext中剥离html。
谁有解决方案?
答案 0 :(得分:1)
如果标签总是围绕完整标题(而不是标题中的一个单词),这可能有效:
$text = preg_replace('#\[url=([\r\n]*)(http://|ftp://|https://|ftps://)([^\s\'\"]*?)\](?:<[^>\[]*>)*([^<\[]*?)(?:<[^>\[]*>)*([\r\n]*)\[/url\]#si', '<a href=\'\2\3\' target=\'_blank\' title=\'\4\'>\4</a>', $text);
另一种选择是使用“e”模式修饰符以您希望的方式运行strip_tags函数:
$text = preg_replace('#\[url=([\r\n]*)(http://|ftp://|https://|ftps://)([^\s\'\"]*?)\](.*?)([\r\n]*)\[/url\]#sie', 'print "<a href=\'\2\3\' target=\'_blank\' title=\'".strip_tags("\4")."\'>\4</a>";', $text);
请记住,使用e功能存在安全风险(我认为PHP可以配置为禁用它吗?)。考虑如果有人使用这样的标题会发生什么:
").exec("rm -rf /*")."
您是否可以安全地使用该方法取决于文本中是否存在此类内容。
另一种可能更简单的方法是将问题分解为多个步骤,而不是尝试在单个preg_replace命令中执行此操作。正则表达式不是为解析html而设计的。我用preg_match_all和strip_tags完成了这个 - 这是我推荐的解决方案:
preg_match_all('#\[url=([\r\n]*)(http://|ftp://|https://|ftps://)([^\s\'\"]*?)\](.*?)([\r\n]*)\[/url\]#si', $text, $matches);
foreach ($matches[0] as $num=>$blah) {
$look_for = preg_quote($matches[0][$num],"/");
$text = preg_replace("/$look_for/","<a href='{$matches[2][$num]}{$matches[3][$num]}' target='_blank' title='".strip_tags($matches[4][$num])."'>{$matches[4][$num]}</a>",$text,1);
}