我写了正则表达式,将文本链接转换为可点击链接。代码工作正常,但是当传递HTML标记时,它会使代码混乱
这是我的代码
$text = preg_replace('#(?<![">])((http|ftp)s?://[^<>\s]+)#i', '<a href="\\0">\\0</a>', $text );
假设跳过以下元素
<a href="http://www.yahoo.com">Yahoo</a>
但它没有......我做错了什么?
由于
答案 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