2010-10-15 104 views
2

我知道有相當一些術語突出顯示問題,但據我所知,沒有人回答我的問題。搜索術語放入數組術語突出顯示算法(HTML)

$keyarray = array("DE", "ABCD"); 
$string = "ABCDEF"; 
foreach ($keyarray as $value) { 
    $string = str_ireplace($value, "<b>{$value}</b>", $string); 
} 

結果顯然將是ABC DE˚F而不是ABCDE˚F 所以它的存在,無論如何方式,我可以使用粗體標籤極快的使用突出兩個術語PHP?

+1

不確定我關注。這兩個術語?目前只有其中一個匹配您的字符串... – 2010-10-15 08:02:59

+0

所以你想要你的結果是'ABC DE'? – Hannes 2010-10-15 08:04:43

+0

@Gordon謝謝你的注意 @Nev斯托克斯,這兩個詞都在字符串中,但只有一個匹配,在錯字糾正後 @亨利這是一個有效的答案,但只要它將所有提到的詞加粗就可以了。 – vener 2010-10-15 08:19:52

回答

0

也許使用類似的正則表達式:/de|acbd/。正則表達式是從左至右搜索和它不會回來,會出現像<b>1111<b></b>112222</b>

0

沒有situtation你可以試試這個:

$keyarray = array("DE", "ABCD"); 
$string = "ABCDEF"; 
$words = explode(' ',$string); 
foreach($words as &$w){ 
    foreach($keyarray as $criteria) { 
     if(stripos($w,$criteria)!==false){ 
      $w = "<b>$w</b>"; 
        break;//avoid duplicate wrapping 
     } 
    } 
} 
$string = implode(' ',$words); 
1

「極快」是一個相對的概念。除此之外,你有幾種選擇:

  • 正則表達式:如果你對正則表達式非常好,這是對他們有用的。你也可以向前看/背後看,這可以提供相當大的靈活性。

http://www.regular-expressions.info/lookaround.html

  • 逐字符解析:這是經常做的字符串操作,最快的最好的方法,但可能是最耗時的創建。

  • String替換;速度很快,但通常有一個邊緣案例無法正確工作(根據經驗)。

在所有這些情況下,您可以受益於優化的前你的條件清單按排序/分組/過濾合適他們。例如,從最大長度到最小長度的排序可以確保您不會通過在其中加粗較短的字符串來拆分長字符串(並且錯過匹配)。

您也可以通過在開始替換之前檢查所有搜索詞來預先確定最佳正則表達式。再次,這會假定你對正則表達式很瞭解。

+0

正則表達式不存在問題,算法必須像字符串替換一樣快或更快。 從較長的字符串到較短的字符串排序有所幫助,但仍然有像上面描述的那種情況不起作用的情況(沒有影響速度太快) 能否詳細說明字符分析方法? – vener 2010-10-15 15:15:53

+0

@vener - 字符逐字符解析通常意味着通過一個字符將字符串一次一次轉發到一個或多個緩存中,以執行經濟的測試。正如我在我的回答中所說的那樣,編寫這個文件比編寫查找/替換文件要困難得多,但它非常強大,因爲您可以完全控制窺視與前進,匹配條件,跳過等等。我最近在C#中編寫了一個XHTML解析器,它可以咀嚼大小相當的頁面,並在5ms內將其轉換爲對象模型。 PHP字符串是一個char數組,但不知道它如何與C++/C#/ Java進行比較以獲得速度。 – 2010-10-15 18:35:26