PHP正则表达式跳过元素

时间:2010-08-16 18:00:02

标签: php regex

我写了正则表达式,将文本链接转换为可点击链接。代码工作正常,但是当传递HTML标记时,它会使代码混乱

这是我的代码

$text = preg_replace('#(?<![">])((http|ftp)s?://[^<>\s]+)#i', '<a href="\\0">\\0</a>', $text );

假设跳过以下元素

<a href="http://www.yahoo.com">Yahoo</a>

但它没有......我做错了什么?

由于

2 个答案:

答案 0 :(得分:1)

确实跳过了它。 "位于网址之前,因此背后的负面效果使其不匹配。

无论如何,为了可靠地执行此操作,您应该使用HTML解析器。您只能转换文本节点,而不必担心现有的HTML元素。

答案 1 :(得分:0)

用两个输入检查代码后:

$text1 = '<a href="http://www.yahoo.com">Yahoo</a>';
$text2 = 'text text http://www.yahoo.com text';

$reg = '{
         (?<![">])
         (
           (?:http|ftp)s? : // [^<>\s]+
         )
        }ix';

echo  preg_replace($reg, '<A HREF="\1">\1</A>', $text1 ) . "\n";
echo  preg_replace($reg, '<A HREF="\1">\1</A>', $text2 ) . "\n";

并阅读相应的输出:

=> #1 not touched  <a href="http://www.yahoo.com">Yahoo</a>
=> #2 modified     text text <A HREF="http://www.yahoo.com">http://www.yahoo.com</A> text

我会问你认为应该有什么不同之处?

此致

RBO