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


Convert text link to HTML with context considered

我想将链接(如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的未知意大利面沙拉