2011-08-20 87 views
0

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

我发现这在另一个问题:

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

[请勿做它!](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – cwallenpoole

+0

bbpress做除了浏览他们的意大利面代码之外,我似乎无法弄清楚它是如何做到的。 –

+1

上下文感知并不简单,但您可能会忽略最小查找。用“(?<!href =”| src =“|”>)排除主要罪魁祸首的否定断言(另一种常见方法是*通过移除已经HTML化的URL来规范化输入文本) – mario

回答

1

基于马里奥对我原来的职位评论:完全更换的bbPress的未知面食沙拉

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

作品。

1

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

+0

也许你可以提供一个示例XSLT来进行转换? –

+0

我从来没有做过任何XSLT,我会用一个while循环来实现它,因为包含多个URL的文本节点需要多次处理。 – Allan