Я разработал следующую функцию, чтобы выделить имена результатов поиска.
function highlight($text, $words)
{
if (!is_array($words))
{
$words = preg_split('#\\W+#', $words, -1, PREG_SPLIT_NO_EMPTY);
}
$regex = '#\\b(\\w*)(';
$sep = '';
foreach ($words as $word)
{
$regex .= $sep . preg_quote($word, '#');
$sep = '|';
}
$regex .= ')(\\w*)\\b#i';
$text = preg_replace($regex, '\\1<b>\\2</b>\\3', $text);
$text = str_replace("</b> <b>"," ",$text);
return $text;
}
Моя проблема в том, что если текст «Это конец», и я ищу «это», он будет выделен так:это есть конец «потому что слово« есть »тоже в« этом ».
Кто-нибудь знает, как это исправить?
Моей первой мыслью было заменить только пробел [пробел], но это не очень хорошее решение, потому что первое слово в предложении не получило пробела в начале. 🙁
Спасибо за помощь.
Удалить \w*
для начала и конца регулярных выражений:
$regex = '#\\b(';
$sep = '';
foreach ($words as $word)
{
$regex .= $sep . preg_quote($word, '#');
$sep = '|';
}
$regex .= ')\\b#i';
$text = preg_replace($regex, '<b>$1</b>', $text);
Других решений пока нет …