2011-09-04 16 views
1

我現在有一個循環下面的代碼:正則表達式的幫助生成鏈接

$message = preg_replace("/({$data[0]})/i","<a href=\"{$data[1]}\" class=\"postlink\">$1</a>",$message,1); 

這個循環的關鍵是尋找特定關鍵字($數據[0]),並把它們變成鏈接$ data [1]中的URL。我也使用的1

該工程確定,在一定程度上的限制。不過,我正在嘗試改進此正則表達式,以防止以下問題出現:

  • 如果URL實際上包含標記的關鍵字,則會導致事情混亂。例如,如果「測試」是一個關鍵字,並且該頁面鏈接到像「http://www.site.com/test.html」這樣的URL,那麼它將替換「test.html」,這是錯誤的。它應該忽略它。
  • 如果文本中包含類似<a href="blabla">this is a test</a>,我不想關鍵字「test」將被替換,因爲它已經是一個鏈接的一部分。

這些是我迄今爲止發現的兩個主要問題,可能還有更多。我正在尋求幫助,撰寫更好的正則表達式來避免這些問題。

謝謝

+0

對於第一個問題,探測周圍的空白。上下文敏感的正則表達式匹配有點複雜;所以對於後一個問題,使用第二個preg_replace_callback來過濾這些情況可能是有意義的。 – mario

回答

0

這些都很有趣。要使用,只需用下面的模式中的數據替換「test」即可。

/test(?![^><]*?(?:>|<\/a))/ 

編輯:更新了模式。

在回答您的評論,請使用以下:

$message = preg_replace("/({$data[0]}(?![^><]*?(?:>|<\/a)))/i","<a href=\"{$data[1]}\" class=\"postlink\">$1</a>",$message,1); 
+0

圓括號應該保存一個變量供以後使用 - 我在這裏看到你使用了一對括號,是不是與它衝突? –

+0

另外我不確定哪些字符需要轉義或不轉換......到目前爲止它崩潰 –

+0

事實證明,PCRE不支持可變寬度lookbehind模式,所以我改變了模式只使用lookaheads。 –

0

這只是檢查是否存在該線的開始時,或者在關鍵字前添加一個空格,和字符串的結束,或者空格後字:

$message = preg_replace("/(^|\s)({$data[0]})($|\s)/mi","$1<a href=\"{$data[1]}\" class=\"postlink\">$2</a>$3",$message,1); 

這應該解決您的問題。

+0

它會解決this test works其中「測試」是關鍵字?我認爲它會在鏈接中創建一個鏈接嗎? –