Есть вот такая функция:
function summarize($haystack,$needle,$wordLimit = 5) {
// first get summary of text around key word (needle)
$preg_safe = str_replace(" ", "\s", preg_quote($needle));
$pattern = "/(\w*\S\s+){0,$wordLimit}\S*\b($preg_safe)\b\S*(\s\S+){0,$wordLimit}/iux";
if (preg_match_all($pattern, $haystack, $matches)) {
$summary = str_replace(strtolower($needle), "<strong>$needle</strong>", $matches[0][0]) . '…';
} else {
$summary = false;
}
return $summary;
}
Она выбирает часть длинного текста из $haystack вокруг найденного $needle. Это нужно чтобы показать пользователю часть найденного текста вокруг этого поискового запроса.
Если текст на входе английский, то работает. Если русский, то не работает. Использовал конвертацию в cp1251, но не помогло. В регулярке стоит флаг «u», который должен помочь, но не помогает.
Тестировать можно на таком вызове функции:
echo summarize("тут очень много текста на входе","на");
А вот так работает:
echo summarize("Lorem ipsum dollar","ipsum");