2012-09-24 75 views
0

我有以下文本:PHP的正則表達式匹配表達式不包含模式

「這是一個測試文本,測試,逗號而不是空格。」

我遍歷每個單詞並希望將每個單詞替換爲不同的鏈接。比方說,

<a href="wordToReplace">wordToReplace</a> 

我的問題是,「測試」一詞的連續兩場比賽(使用上面的例子)更換href和錨文本,所以我離開了裏面這是不好的,在所有的鏈接的鏈接。

(給我的問題的基本思路,這是我留下什麼用。它有一些額外的標記。)

This is a<a href="/index.php?r<a href="/index.php?r=texts/addWord" 
class="wordLink info label" id="yt2">text</a>/addWord" class="wordLink 
info label" id="yt1">test</a>text.<a href="/index.php?r=texts/addWord" 
class="wordLink info label" id="yt3">Test</a><a 
href="/index.php?r=texts/addWord" class="wordLink info label" 
id="yt4">comma</a>instead of<a href="/index.php?r=texts/addWord" 
class="wordLink info label" id="yt6">space</a> 

我想

preg_replace("/[^\">]".$word."[^\"<]/", $link, $text->text); 

,但我不我認爲我沒有走上正軌。

感謝您的時間

+0

那豈不是更容易只是使用'str_replace()函數'? –

+0

在原稿上匹配,在使用位置的副本上進行替換,或者也可以使用替換上的起始偏移量,但您需要在計算時進行計算。 – Orbling

回答

1

從你的一行代碼,我假設你有一個循環,線,通過所有的$words要替換,這將導致問題迭代。

您需要做的是將所有這些替換放入只有一個preg_replace調用。爲此,正則表達式提供了替代方法。所以說,你的單詞列表包括test,textthis。然後,你可以這樣做:

preg_replace('/(test|text|this)/', $link, $text->text); 

如果你把所有的話在一個數組$words那麼你就可以生成正則表達式簡單地:

$wordList = implode('|', $words); 
preg_replace('/('.$wordList.')/', $link, $text->text); 

你可能想在最後添加i的正則表達式,如果你的支票應該是不區分大小寫的。

在某些情況下,你的話是換句話說部位(例如要替換texttexture),你可以檢查單詞邊界:

preg_replace('/\b('.$wordList.')\b/', $link, $text->text); 

這是你在找什麼?

編輯:如果您$link是爲在你之前,每個循環預$word產生的,你現在可以用$1替換詞。如果您$link是像

$link = '<a href="'.$word.'">'.$word.'</a>'; 

你現在可以簡單地使用

$link = '<a href="$1">$1</a>'; 
+0

爲什麼不使用單詞邊界運算符'\ b'? – trickyzter

+0

對不起,現在已經遲到了--.-- ...現在編輯它。 –

+0

可以理解。 ;) – trickyzter