将文本链接转换为HTML,并考虑上下文

时间:2011-08-20 02:44:05

标签: php html regex

我想将http://google.com/之类的链接转换为HTML,但是如果它们已经在HTML链接中,无论是在href =“”还是在链接的文本中,我都不想转换它们。

我在另一个问题中发现了这个问题:

preg_replace('@(https?:\/\/([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $text);

但是,如果我有以下内容:

<a href="http://google.com/">http://google.com/</a>

已经在相关的目标文本中,它将在该HTML中创建两个链接。我似乎无法弄清楚知道它是在“之前还是在”之前的模式。

2 个答案:

答案 0 :(得分:1)

不要使用正则表达式进行(X)HTML解析。改用DOM吧! XPath //text()[not(ancestor::a) and contains(., 'http://')][1]应该找到第一个文本节点,其中包含至少一个本身不包含在锚标记中的HTTP URL。您可以天真地用包含前面文本的文本节点,包含href属性和href文本节点的锚元素节点以及包含剩余文本的文本节点替换文本节点。这样做直到找不到与XPath匹配的文本节点。

答案 1 :(得分:1)

基于马里奥对我原帖的评论:

preg_replace('@(?<!href="|src="|">)(https?:\/\/([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1">$1</a>', $text);

完美地替代bbpress未知的意大利面沙拉。