我想将链接(如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中创建两个链接。
不要使用正则表达式进行(X)HTML解析。使用DOM代替!XPath //text()[not(ancestor::a) and contains(., 'http://')][1]
应该找到包含至少一个HTTP URL的第一个文本节点,该HTTP URL本身没有包含在锚标记中。您可以简单地将文本节点替换为包含前面文本的文本节点、包含href属性和href文本节点的锚元素节点以及包含剩余文本的文本节点。这样做,直到找不到与XPath匹配的文本节点为止。
根据mario对我原帖子的评论:
preg_replace('@(?<!href="|src="|">)(https?:'/'/([-'w'.]+[-'w])+(:'d+)?(/(['w/_'.#-]*('?'S+)?[^'.'s])?)?)@', '<a href="$1">$1</a>', $text);
可以完美地代替bbpress的未知意大利面沙拉