Задача: есть набор ключевых слов, которые наличествуют в тексте страницы и прописаны в мета-теге keywords. Как их автоматически выделить на странице посредством тега <strong>, учитывая, что слова имеют различные окончания, а также могут иметь дефисы.

Решение: пара строк с использованием регулярных выражений. Корректное отображение кириллицы в UTF-8 учтено. Пример сделал для файла-шаблона материала под Joomla.

if($this->item->metakey) {
$keywords = explode(", ",$this->item->metakey);
echo preg_replace('/[0-9a-zA-Zа-яА-Я\-]*(' . implode(
'|', $keywords) . ')[0-9a-zA-Zа-яА-Я\-]*/siu',
'<strong>$0</strong>', $this->item->text);
} else echo $this->item->text;


Сначала проверяем указаны ли вообще ключевики. Если указаны (через запятую с пробелом), загоняем их в массив посредством explode(). Затем прописываем регулярное выражение, в котором указываем:

  1. Что до и после ключевого слова  может быть любое количество букв латинского и русского алфавитов, а также цифр, в т.ч. дефисы.
  2. Сами ключевые слова, которые потребуется заменить на них же, но только обрамленных <strong>.
  3. В секции модификаторов справа, что обработка нечувствительна к регистру и ведется над кодировкой Unicode.

Второй параметр функции замены через регулярные выражения preg_replace содержит результирующий шаблон, в котором $0 - ссылка на совпадения.

Если ключевые слова не указаны, просто выводим текст, не трогая.

UPD: чтобы наш обработчик не трогал атрибуты тегов, такие как: alt или src у img, в которых могут присутствовать ключевые слова, добавим маленькое правило в регулярное выражение:

echo preg_replace('/(?![^<]+>)[0-9a-zA-Zа-яА-Я\-]*(' . implode(
'|', $keywords) . ')[0-9a-zA-Zа-яА-Я\-]*/siu',
'<strong>$0</strong>', $this->item->text);
Наверх