2010-06-17 91 views
4

好吧我試圖在搜索腳本中使搜索條件加粗,除非我無法使其工作區分大小寫。PHP不區分大小寫替換

function highlight($term,$target){ 
    $terms = explode(" ", $term); 

    foreach($terms as $term){ 
     $result = (eregi_replace($term, "<strong>$term</strong>", $target)); 
    } 
    return $result; 
} 

這是我具備的功能至今。它說,在PHP.net是eregi_replace不區分大小寫的匹配,但它顯然不工作的一些原因。 (我是一個noob)。

任何想法? :d

回答

8

ereg_*的(POSIX正則表達式)函數是作爲deprecated PHP 5.3的,並沒有被建議用於長的時間。最好使用PCREpreg_*)函數(如preg_replace)。

您可以通過創建一個不區分大小寫的正則表達式,然後包裹比賽在<strong>標籤這樣做:

function highlight($term, $target) 
{ 
    $terms = array_unique(explode(" ", $term)); // we only want to replace each term once 
    foreach ($terms as $term) 
    { 
    $target = preg_replace('/\b(' . preg_quote($term) . ')\b/i', "<strong>$1</strong>", $target); 
    } 

    return $target; 
} 

這樣做什麼是第一次調用preg_quote$term所以,如果有任何字符在術語中的正則表達式中具有意義,它們會被轉義,然後創建一個正則表達式,查找包含單詞邊界的術語(\b - 因此,如果術語「好」,則不匹配「再見」) 。該術語用圓括號表示,以使正則表達式引擎將其現有形式的術語捕獲爲「反向引用」(正則表達式引擎掛在部分匹配上的方式)。通過指定i選項使該表達式不區分大小寫。最後,它會替換與<strong>標記包圍的相同反向引用的所有匹配項。

$string = "The quick brown fox jumped over the lazy dog. The quicker brown fox didn't jump over the lazy dog."; 
$terms = "quick fox"; 
highlight($terms, $string); 
// results in: The <strong>quick</strong> brown <strong>fox</strong> jumped over the lazy dog. The quicker brown <strong>fox</strong> didn't jump over the lazy dog. 

如果你想要一個關於正則表達式的好教程,請查看關於regular-expressions.info的教程。

+1

如果用戶搜索「時鐘」,'str_ireplace'會將文本中的'Clock'變成'clock'。不是一個好的選擇。 – 2010-06-17 22:26:34

+0

好點,我會更新我的答案。 – 2010-06-17 22:27:49

+0

@Pekka,他問大小寫不匹配,爲什麼它不是一個好的選擇。它只是.. – 2010-06-17 22:32:21

0
function highlight($term,$target) 
{ 
    $terms = explode(" ", $term); 

    foreach($terms as $term){ 
     $target = (str_ireplace($term, "<strong>$term</strong>", $target)); 
    } 
    return $target; 
}