ereg_*
的(POSIX正則表達式)函數是作爲deprecated PHP 5.3的,並沒有被建議用於長的時間。最好使用PCRE(preg_*
)函數(如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的教程。
如果用戶搜索「時鐘」,'str_ireplace'會將文本中的'Clock'變成'clock'。不是一個好的選擇。 – 2010-06-17 22:26:34
好點,我會更新我的答案。 – 2010-06-17 22:27:49
@Pekka,他問大小寫不匹配,爲什麼它不是一個好的選擇。它只是.. – 2010-06-17 22:32:21