PHP

Добрый день, у меня вопрос по php

Пытаюсь написать простой поиск для сайта на php, и вроде бы все получается и поиск ищет, но хочется сделать так что бы слово которое ищу выделялось красным, и я это сделал, но выводит у меня весь текст статьи и выделяется слово, я хочу что бы выводило кратко например 5 слов до найденного слова и 5 слов после.

Вот мой код:

$query = "Слово";

$text = "Много текста";

$needle = $query;
$text = explode($needle, $text);
$text = implode('<b style="color: red;">' . $needle . '</b>', $text);

echo "$text";

Подскажите как это реализовать.
  preg_replace('/'.$needle.'/',  '' . $needle . '', $text) 
HH
Harry Handsome
59 846
Лучший ответ
Найди место слова в тексте и вырежи из текста участок из пяти слов до этого слова и пяти слов после. Например, так:
 preg_match('#(?:\w+\W+){0,5}\b'. $needle . '\b(?:\W+\w+){0,5}#su', $text, $result); 
Максим Киреев
Максим Киреев
96 307
вот это
$needle = $query;
ваще феерично!
AF
Aleksandr Fomin
47 631
Можно вот так:
 echo preg_replace("/([\wа-яА-ЯёЁ]+[\s\.\,\:\;]+){0,5}({$query})([\s\.\,\:\;]+[\wа-яА-ЯёЁ]+){0,5}/","$0",$text); 

На тесте такой код работает корректно:
 $query = "commodo"; 

$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";

echo preg_replace("/([\wа-яА-ЯёЁ]+[\s\.\,\:\;]+){0,5}({$query})([\s\.\,\:\;]+[\wа-яА-ЯёЁ]+){0,5}/","$0",$string);
Вывод:
 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 

Немного о регулярке:
([\wа-яА-ЯёЁ]+[\s\.\,\:\;]+)
Этот кусок отвечает за поиск слова ДО поискового значения + пробел, запятая, точка, двоеточие или точка с запятой после окончания слова.

Конструкция \w соответствует любой букве от A до Z в верхнем и нижнем регистрах и цифрам 0-9.
а-яА-ЯёЁ
Ищет так же вхождения на кириллице. ёЁ – отдельно, поскольку не включено в общий набор алфавита при указании "а-яА-Я".
Соответственно ищем минимум одну букву и минимум один пробел/точку/запятую после него. Всё это повторяем от 0 до 5 раз (т.к. поисковой запрос может оказаться в самом начале статьи, и пяти слов там может не набраться; по умолчанию выбирается именно 5 слов) – это делается конструкцией {0,5}

({$query})
Это блок поиска конкретного запроса, то есть от чего мы и отталкиваемся.

([\s\.\,\:\;]+[\wа-яА-ЯёЁ]+){0,5}
Аналогично первой части, в которой мы ищем слово+символ, однако в этом случае наоборот – ищем сначала символ, потом слово. Также от 0 до 5 раз.
ША
Шакир Аипов
11 395
Максим Киреев Бессмысленное усложнение, не работающее, например, с греческим алфавитом и предложениями, заканчивающимися вопросительным или восклицательным знаками.

При использовании модификатора 'u' класс '\w' означает букву любого алфавита, входящего в Unicode, цифру или '_'. А класс '\W' - любой символ, отличный от вышеперечисленных.