ereg_*
(POSIX регулярных выражений) функции deprecated в РНР 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', если пользователь выполнил поиск' clock'. Нехороший вариант. –
Хорошо, я уточню свой ответ. –
@Pekka, он попросил нечувствительность к регистру, почему это нехороший вариант. Он делает именно это. –