2013-04-03 134 views
2

我有一個字典單詞列表,我加載到一個數組中。我從數據庫表文本字段中獲取一段文本。用超鏈接替換單詞,單獨留下超鏈接文本,

我循環遍歷字典中的單詞,並且在每次迭代中,我檢查文本塊是否出現該單詞。無論何時找到匹配項,我都會使用超鏈接版本替換該塊中的單詞,因此,當發佈文本塊時,可以使用鼠標指針懸停在其上,並彈出一個定義。

這是簡單實現了正則表達式:

$text = preg_replace("/($dictionary_word)/i", '<a href="" class="glossary_term">$1</a>', $text, -1, $count); 

如果我運行「字典單詞連接」比不過一次,則鏈接將被成倍上漲。

我需要做的是代碼正則表達式,用於檢測到達字典單詞時尚未關閉的打開定位標記。這樣我就會知道這個詞已經被鏈接了,所以我跳過了它。

我嘗試了各種展望未來的組合,並沒有成功。

+0

所以,顯而易見的問題是,爲什麼不止一次地運行它? – nickb

+0

嗨,尼克,如果更多的單詞被添加到字典中,我會重新運行替換。有許多記錄都有一段文字。另外,替換前的原始文本可能有其他鏈接,我不想在鏈接中放置鏈接。 –

+0

我發現如果你在後面或前面尋找的模式是可變長度的,你不能做一個後視或前瞻斷言。 即您在後面或前面尋找的模式中不能使用'*'或'+'。 –

回答

0
$str = "today is 2013-04-03, tomrrow is 2013-04-04"; 
$output1 = preg_replace("/(\d{4}-\d{2}-\d{2})/i", "happy day", $str, 1); 
$output2 = preg_replace("/(\d{4}-\d{2}-\d{2})/i", "happy day", $str); 

只替換一次。

echo $output1; 
today is happy day, tomrrow is 2013-04-04 

全部更換

echo $output2; 
today is happy day, tomrrow is happy day 

你看到的區別?

+0

感謝@qqas,但我的模式不能像您在代碼中演示的那樣具體。我需要檢測超鏈接的單詞並允許多次傳遞。無論如何,我所做的是使用span標籤而不是anchor標籤,這樣,如果字典工作出現在超鏈接中,我仍然可以設計這個詞的樣式並使用javascript/JQuery來執行彈出式定義 –

1

爲了簡單起見,你可以檢查匹配的詞沒有緊跟</a>

"/\b($dictionary_word)\b(?!<\/a>)/i" 

還應注意\b增加。這將避免匹配例如spitting中的pit(這將使其變爲s<a ...>pit</a>ting)。

也許您在文檔中有其他類型的超鏈接文本?這將阻止所有超鏈接的單個單詞被鏈接到字典,這是合適的,因爲一個單詞不能成爲兩個URL的一部分。但是這些都不會檢測到<a href="...">a longer stretch of linked text</a>中間的單詞。如果你需要更聰明的行爲,你需要的不僅僅是一種愚蠢的正則表達式替換方法。