我想将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中创建两个链接。我似乎无法弄清楚知道它是在“之前还是在”之前的模式。
答案 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未知的意大利面沙拉。