2011-09-23 65 views
1

這是一個問題,我已經想出瞭如何解決,但我想以一種更簡單的方式解決它...我試圖改進爲程序員。PHP:在字符串中加入重疊關鍵字的缺點

已經做了我的研究,並沒有找到一個優雅解決以下問題:

我有一個關鍵字假設陣列搜索:

$keyword_array = array('he','heather'); 

和假設的字符串:

$text = "What did he say to heather?"; 

最後,一個假設的功能:

function bold_keywords($text, $keyword_array) 
{ 
    $pattern = array(); 
    $replace = array(); 

    foreach($keyword_array as $keyword) 
    { 
     $pattern[] = "/($keyword)/is"; 
     $replace[] = "<b>$1</b>"; 
    } 

    $text = preg_replace($pattern, $replace, $text); 

    return $text; 
} 

功能(不是太奇怪的)這樣的事返回:

"What did <b>he</b> say to <b>he</b>ather?" 

因爲它是不承認「海瑟」時,有在它的中間有一個大膽的標籤。

我想最終的解決方案做的是,儘可能簡單,返回以下兩個字符串之一:

"What did <b>he</b> say to <b>heather</b>?" 
"What did <b>he</b> say to <b><b>he</b>ather</b>?" 

最後的一些條件:

- 我想最後的解決方案處理大量可能的關鍵字

- 我希望它能處理以下兩種情況(線表示重疊字符串):

一個字符串吞噬其他的,像下面的兩個例子:

- 他,石楠

- 打磨,並

或者一個字符串不吞噬其他:

- 夾帶,培訓

可能的方法來解決:

-A REG當然,無視在關鍵字標籤

- 長的方式(即我試圖避免):

*爲每個關鍵字出現的所有搜索字符串,存儲關鍵字的位置的數組(開始和結束)是粗體

*處理這個數組遞歸結合重疊的關鍵字,所以沒有冗餘

*添加粗體標記(從字符串的末端開始,以避免將信息從所述其他字符移位位置)

非常感謝提前!

回答

0

簡單化和懶惰十歲上下的方法折頂我的頭:

排序您的項目長度初始陣,降!沒有更多的「不承認,因爲已經有中間的標籤」問題!

編輯:嵌套標籤的問題,然後很容易通過擴展您的正則表達式的方式,> foo和foo <不再匹配。

0

需要更改您的正則表達式模式,以識別您搜索的每個「術語」後面跟有空格或標點符號,以便它不會將模式匹配應用於後跟字母數字的項目。

1

Example

$keyword_array = array('he','heather'); 
$text = "What did he say to heather?"; 
$pattern = array(); 
$replace = array(); 
sort($keyword_array, SORT_NUMERIC); 
foreach($keyword_array as $keyword) 
{ 
    $pattern[] = "/ ($keyword)/is"; 
    $replace[] = " <b>$1</b>"; 
} 

$text = preg_replace($pattern, $replace, $text); 

echo $text; // What did <b>he</b> say to <b>heather</b>? 
+0

謝謝您的回答。這看起來好像適用於特定的情況,但不喜歡在我提到的所有情況下都能正常工作。例如:$ keyword_array = array('heat','ather')。 –

+0

@Nathan假設您正在嘗試構建一個真實世界的應用程序:您是否知道在嵌套或聯鎖粗體標記中沒有Point? – vzwick

+0

@vzwick:我同意這不是一個好習慣......但是我認爲大多數瀏覽器都不會「窒息」它......我只是在Firefox和Chrome上測試了一個例子,它似乎工作正常。 –