dmx
Хранитель порядка
- Регистрация
- 22 Июн 2011
- Сообщения
- 715
- Реакции
- 708
- Автор темы
- #1
Нужно сделать подсветку ключевых слов в тексте
Найдена вот такая функция:
подсвечивает только точное слово. Типа: слово
А надо чтоб учитывало и склонения или как их назвать. т.е полностью слово
так же, хотелось бы не подсвечивать слова меньше 2 символов (различные предлоги).
Ну и оставить только саму функцию, лишнего не надо ))
Найдена вот такая функция:
PHP:
<?php
/*
Функция подсветки слов
$text - текст
$keywords - ключевые слова
$onlystring - определяет способ вывода
* false - выводим весь текст
* true-выводим только строки, содержащие ключевые слова
$integrity - определяет параметры поиска
* false - любое совпадение
* true - фразу целиком
$fontcolor - каким цветом подсвечивать
*/
function light_text($text, $keywords, $onlystring = false, $integrity = true, $fontcolor = "red")
{//Пробелы
$keywords = trim($keywords);
$text = trim($text);
//Проверка полученных данных
if(empty($text) || empty($keywords))
return false;
//Спецсимволы PCRE
$keywords = preg_quote($keywords, '#');
//Ищем html, style, script, title
$re = '#<script[^>]*?>.*?</script>|<style[^>]*?>.*?</style\s*?>|<title\s*?>.*?</title\s*?>|<.*?>#is';
preg_match_all($re, $text, $html);
//Удаляем одинаковые элементы, сортируем для того чтобы сбросить ключи
$html = array_unique($html[0]);
sort($html);
//Массив с указателями
$j = 1420;
$i = 0;
while($i<count($html))
{
$token[$i] = html_entity_decode('&#'. $j .';', ENT_NOQUOTES, 'UTF-8');
$tags[$i] = $html[$i];
$i++;
$j++;
}
//Замена html, style, script, title указателями
if(!empty($html))
$text = str_replace($tags, $token, $text);
//Поиск
if(!empty($integrity))
{//Если ищем всю фразу
$re = '('. $keywords .')';
}
else
{//Любое совпадение
//Массив с ключевыми словами
$keywords = explode(' ', $keywords);
//Удаляем пустые элементы
foreach($keywords as $k=>$v)
{
if(empty($v)) unset($keywords[$k]);
}
$re = '('. implode('|', $keywords) .')';
}
//Ищем и подсвечиваем
if($onlystring)
{//Если выводим только строки
$re_for_string = '#.*'. $re .'.*#ui';
preg_match_all($re_for_string, $text, $text);
$text = implode("\n", $text[0]);
if(!empty($token))
$text = str_replace($token, '', $text);
}
$re = '#'. $re .'#uis';
$text = preg_replace($re, '<font color="'. $fontcolor .'">\\1</font>', $text);
//Вставляем html,css,js на место
if(!empty($html))
$text = str_replace($token, $html, $text);
//Возвращаем
return $text;
}
$text = 'А вот не объявить ли новый конкурс к Новому году приуроченный?
Задачка небольшенькая по объему, но достаточно интересная по реализации.
Итак.
Требуется написать скрипт подсветки ключевых слов поиска.
Скрипт должен быть универсальным, в виде функции или класса, легко интегрируемый в любую систему.
Особенности таких скриптов, которые нужно учесть.
1. Подсвечиваться должны несколько ключевых слов.
2. Регистр не учитываем.
3. Слова могут повторяться и идти вразнобой.
4. Сам скрипт поиска не нужен, только механизм подсветки.
5. Результат примерно как в тексте задачи, если бы в скрипт передали фразу "скрипт подсветки слов поиска"
Ну разумеется корректность, оптимальность, безопасность, читабельность.
Стартуем, как наберем минимум 10 человек. Принимать участие могут все желающие.
Заявляться в этой ветке.
Оценивать будут члены жюри, желающие эксперты тоже здесь заявляйтесь.
Если желающих не будет, я сам вынесу вердикт.
Экспериментов больше не будет.
Ну и из песни слов не выкинуть - приз.
По традиции любая книга по программированию, которую можно купить в интернет-магазине.
Смелей, товарищи! Помните, главное не участие, главное победа!
PS Совсем забыл. Дополнительный функционал приветствуется. Допустим обрезка текста до и после найденных слов, настройка вариантов и прочее.
Вобщем чем круче скрипт, тем больше шансов.';
$keywords = 'скрипт подсветки слов поиска';
echo light_text($text, $keywords);
А надо чтоб учитывало и склонения или как их назвать. т.е полностью слово
так же, хотелось бы не подсвечивать слова меньше 2 символов (различные предлоги).
Ну и оставить только саму функцию, лишнего не надо ))