2012-08-14 113 views
-2

可能重複:
Finetune Regex to skip tags正則表達式的語法問題

目前我的功能看起來是這樣的。它將純文本URL轉換爲HTML鏈接。

function UrlsToLinks($text){ 
    return preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@', '<a href="$1" target="_blank">$1</a>', $text); 
} 

但也有一些問題。我想要做的是跳過現有的鏈接,src屬性<img>標籤等。無法弄清楚我需要修改這個功能。

+0

你試圖解析的字符串是什麼? – 2012-08-14 19:26:39

+5

使用正則表達式實現您的期望功能非常困難,如果不是不可能的話,更不用說單個正則表達式。您確實應該使用HTML解析器,僅在HTML節點的文本內容中查找鏈接。 – nickb 2012-08-14 19:26:56

+4

你需要做的是使用HTML解析器來提取文本節點,並只通過上述函數運行* them *。試圖修改它,以便它會忽略HTML和HTML的部分將會降低託尼小馬的憤怒,我們都將在火熱的深度燃燒。無論是那個還是你的應用程序都是不安全和不可靠的,其中之一。 – DaveRandom 2012-08-14 19:28:06

回答

1

這會工作,假設我們要替換的URL不在標籤內。

function UrlsToLinks($text){ 
    $matches = array(); 
    $strippedText = strip_tags($text); 

    preg_match_all('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@', $strippedText, $matches); 

    foreach ($matches[0] as $match) {  
     if (filter_var($match, FILTER_VALIDATE_URL)) { 
      $text = str_replace($match, '<a href="'.$match.'" target="_blank">'.$match.'</a>', $text); 
     } 
    } 
    return $text; 
}