2011-08-20 90 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