2010-01-26 78 views
1

我有一個代碼塊,將採取類似下面的文本塊替換非HTML鏈接方法和以下正則表達式:與<A>標籤

preg_replace_callback('/http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)/', 
    create_function(
     '$matches', 
     '$url = $matches[1]; 
     $anchorText = (strlen($url) > 35 ? substr($url, 0, 35).\'...\' : $url); 
     return \'<a href="http://\'. $url .\'">\'. $anchorText .\'</a>\';'), 
    $str); 

將示例文本轉換爲如下形式:

示例文本示例文本< A HREF = 「http://www.google.com」>http://www.google.com </A>示例文本

我現在的問題是,我們已經推出了豐富的文本編輯器可以在發送到腳本之前創建鏈接。我需要更新這段代碼,以便它會忽略已經在標籤內的任何URL。

回答

0

將代碼添加到模式的開始捕捉開口錨標記,然後不執行回調的代碼時,它已經拍攝了一句:

/(<a[^>]*>)?http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)/ 

那麼你需要,如果添加到您的lamda函數來查看是否有任何$匹配[1](不要忘記增加您的捕獲以及)

你不能在這裏使用否定的背後斷言,因爲捕獲不是一個固定的長度,但你可能會對結束標記使用負面預測聲明,因此會丟失整個匹配項:

/(<a[^>]*>)?http:\/\/([,\%\w.\-_\/\?\=\+\&\~\#\$]+)(?!<\/a>)/ 
+0

你的第一個表達式匹配正確,以及剛剛返回$比賽[0]當$匹配[1]不爲空,我可以解決這個問題很容易。但是你的第二個表達式返回:未知的修飾詞「一」 – tombazza 2010-01-26 12:59:26

+0

對不起,我忘了斜線/中,以便將需要<\/a>否則它認爲它是結束模式,一個是修改 – 2010-01-26 14:09:00