Задача: есть набор ключевых слов, которые наличествуют в тексте страницы и прописаны в мета-теге 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(). Затем прописываем регулярное выражение, в котором указываем:
- Что до и после ключевого слова может быть любое количество букв латинского и русского алфавитов, а также цифр, в т.ч. дефисы.
- Сами ключевые слова, которые потребуется заменить на них же, но только обрамленных <strong>.
- В секции модификаторов справа, что обработка нечувствительна к регистру и ведется над кодировкой 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);