preg_replace中的strip_tags

时间:2011-12-31 15:14:06

标签: preg-replace strip-tags

在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。

谁有解决方案?

1 个答案:

答案 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);
}