Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Исправить подсветку ключевых слов функцией ereg_replace()
 
 автор: segazav   (04.04.2013 в 16:41)   письмо автору
 
 

Подскажите, как исправить обыкновенную подсветку ключевых слов заголовка:


$podsvetka = str_replace(" ", "|", $myrow["zagolovok"]);  // Делаем подсветку похожих слов
$zagolovok_podsvetka = ereg_replace($podsvetka, "<font class='podsvetka'>\\0</font>", $myrow3["zagolovok"]);


$myrow["zagolovok"] - ключевой заголовок
$myrow3["zagolovok"] - подсвечиваемые заголовки

Вроде нормально работает, но порой выдает ошибки функции ereg_replace и хотелось бы убрать регистрозависимость заголовков. Заранее благодарен.
И вообще хотелось бы заменить её на другую, слышал что она уже устарела.

  Ответить  
 
 автор: confirm   (04.04.2013 в 16:54)   письмо автору
 
   для: segazav   (04.04.2013 в 16:41)
 

Не слушать надо, а читать )
http://www.php.net/manual/ru/book.pcre.php

  Ответить  
 
 автор: segazav   (04.04.2013 в 17:28)   письмо автору
 
   для: confirm   (04.04.2013 в 16:54)
 

Пробовал так:

// Искомая строка для подсветки на странице
$search = $myrow["zagolovok"];
// Создаем строку для регулярного выражения
$pattern = "/((?:^|>)[^<]*)(".$search.")/si";
// Подсвеченная строка
$replace = '$1<b style="color:#FF0000; background:#FFFF00;">$2</b>';
// Заменяем
$zagolovok_podsvetka = preg_replace($pattern, $replace, $myrow3["zagolovok"]);


либо выдает ошибку, либо ничего не выделяет. Не пойму почему.

  Ответить  
 
 автор: confirm   (04.04.2013 в 17:34)   письмо автору
 
   для: segazav   (04.04.2013 в 17:28)
 

Покажите лучше пример строки в которой вы хотите подсветить и что (чем заменяете).

  Ответить  
 
 автор: segazav   (04.04.2013 в 17:47)   письмо автору
 
   для: confirm   (04.04.2013 в 17:34)
 

$myrow["zagolovok"] - основной заголовок с полным текстом сообщения из базы данных, а ниже выводятся похожие заголовки сообщений $myrow3["zagolovok"].

Все это выводится на страницу в цикле оператором printf()

Хотелось бы подсветить точные совпадения слов в заголовках похожих сообщений $myrow3["zagolovok"] с основным заголовком на странице $myrow["zagolovok"].

Вот так все работает, но выдает иногда ошибки и зависит от регистра букв, да ещё и устаревшая функция ereg_replace().

$podsvetka = str_replace(" ", "|", $myrow["zagolovok"]);  // Делаем подсветку похожих слов
$zagolovok_podsvetka = ereg_replace($podsvetka, "<font class='podsvetka'>\\0</font>", $myrow3["zagolovok"]);

  Ответить  
 
 автор: confirm   (04.04.2013 в 17:51)   письмо автору
 
   для: segazav   (04.04.2013 в 17:47)
 

Я вас о чем просил - показать пример самой строки (одной) в которой нужно подсветить, и ту строку по которой определяется что подсветить (если я правильно понял). А вы мне что показываете? Вы думает я догадываюсь, что содержат ваши $myrow["zagolovok"] и $myrow3["zagolovok"]?

  Ответить  
 
 автор: segazav   (04.04.2013 в 17:58)   письмо автору
 
   для: confirm   (04.04.2013 в 17:51)
 

страница с текстом:

"Поздравления в стихах любимого мужчины" - $myrow["zagolovok"]

в низу страницы похожие сообщения:

"Поздравления в стихах любимой девушки" - $myrow3["zagolovok"]
"Поздравления по СМС мужчины" - $myrow3["zagolovok"]
"Стихи для любимых" - $myrow3["zagolovok"]

P.S. Кавычки не выводятся, только для примера
P.S. Вообщем нужно, чтобы подсвечивалось каждое слово заголовков отдельно, а не вся строка

Ошибок вроде удалось избежать, но ничего не подсвечивается:

// Искомая строка для подсветки на странице
$search = preg_quote($myrow["zagolovok"], "/");
// Создаем строку для регулярного выражения
$pattern = "/((?:^|>)[^<]*)(".$search.")/si";
// Подсвеченная строка
$replace = '$1<b style="color:#FF0000; background:#FFFF00;">$2</b>';
// Заменяем
$zagolovok_podsvetka = preg_replace($pattern, $replace, preg_quote($myrow3["zagolovok"], "/"));

  Ответить  
 
 автор: confirm   (04.04.2013 в 18:16)   письмо автору
 
   для: segazav   (04.04.2013 в 17:58)
 

<?
$s 
"Поздравления в стихах любимого мужчины";
$search "стихах";
echo 
htmlspecialchars(str_replace($search'<b>'.$search.'</b>'$s));
Вот тут мне надо было обрамить слово "стихах", что и сделано, а вы чего пытаетесь?

  Ответить  
 
 автор: segazav   (04.04.2013 в 19:13)   письмо автору
 
   для: confirm   (04.04.2013 в 18:16)
 

Нужно, чтобы каждое слово "Поздравления в стихах любимого мужчины" сравнивалось с каждым словом других заголовков и подсвечивались совпадения.

  Ответить  
 
 автор: confirm   (04.04.2013 в 20:44)   письмо автору
 
   для: segazav   (04.04.2013 в 19:13)
 

Это тоже не проблема, учитывая, что вы разбиваете на составляющие, и в этом случае лучше уж так:
<?
$s 
"Поздравления в стихах любимого мужчины";
$search explode(" ""стихах мужчины");
$replace explode('|''<b>'.implode('</b>|<b>'$search).'</b>');
echo 
htmlspecialchars(str_ireplace($search$replace$s));
Правда это для кодировки 1251. У вас шаблон не соответствует, поэтому и...

  Ответить  
 
 автор: segazav   (04.04.2013 в 23:48)   письмо автору
 
   для: confirm   (04.04.2013 в 20:44)
 

$s = "Поздравления в стихах любимого мужчины";
$search = explode(" ", "стихах мужчины");
$replace = explode('|', '<b>'.implode('</b>|<b>', $search).'</b>');
echo htmlspecialchars(str_ireplace($search, $replace, $s));


Выводит

Поздравления в <b>стихах</b> любимого <b>мужчины</b>

  Ответить  
 
 автор: confirm   (04.04.2013 в 23:57)   письмо автору
 
   для: segazav   (04.04.2013 в 23:48)
 

Ну правильно, это и должно вывести, это ведь пример, и чтобы отобразить строку результирующую и, что замена произошла корректно, html-код замены заменяется на html-сущности. Уберите из примера функцию htmlspecialchars(), будет отображено жирным шрифтом.

  Ответить  
 
 автор: segazav   (05.04.2013 в 00:01)   письмо автору
 
   для: confirm   (04.04.2013 в 23:57)
 

Ага, понял спасибо!
А как сделать вышеуказанный код не регистрозависимым?

  Ответить  
 
 автор: confirm   (05.04.2013 в 00:17)   письмо автору
 
   для: segazav   (05.04.2013 в 00:01)
 

Зачем? Вы прочтите о функции str_replace, ее аргументах, каких типов могут быть ее аргументы, и как производится замена. Ответьте на свой вопрос - нужно ли разбивать на массив, гонять их циклом, если строка поиска и так разбивается на массив?

Вообще, изучайте код примеров, которые вам дают, читая о функциях из примеров. Надо же как-то учится понимать код, и без знания работы функций, на одних подсказках на "как такое сделать?" вы далеко не уедете.

Что вы там хотите подсветить и что значит поиск в вашем случае.... В предложениях:

Рыбалка на природе, это полезно
и
Рыбалка, охота - снаряжения для активного отдыха

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

Так что думайте, размышляйте сами, а этот пример основан только на моих "предположениях".

  Ответить  
 
 автор: segazav   (05.04.2013 в 00:42)   письмо автору
 
   для: confirm   (05.04.2013 в 00:17)
 

Поверьте, иногда просто не хватает времени на плотное изучение PHP, да и забываешь все со временем.
Мне нужна была подсветка точных совпадений слов и с Вашей помощью это получилось, спасибо Вам большое!!!

Но я не понял одного, вроде str_ireplace() не чувствительна к регистру, но если так:


<?php 
$s 
"Поздравления в стихах любимого мужчины";
$search explode(" ""Cтихах мужчины");
$replace explode('|''<b style="background:#FFFF00;">'.implode('</b>|<b style="background:#FFFF00;">'$search).'</b>');
echo 
str_ireplace($search$replace$s);
?>


то "...стихах..." уже не выделяет.

Можно ли как то это исправить?

  Ответить  
 
 автор: segazav   (05.04.2013 в 01:15)   письмо автору
 
   для: segazav   (05.04.2013 в 00:42)
 

Ещё хотелось бы как то исключить из подсветки слова меньше 2-х символов, но не могу сообразить, как правильно применить strlen() в данном примере... а то все предлоги тоже подсвечивает((

  Ответить  
 
 автор: confirm   (05.04.2013 в 11:08)   письмо автору
 
   для: segazav   (05.04.2013 в 00:42)
 

Ну да, взял и поверил. Как говорил лейтенант Коломбо, я не могу понять странности, которые меня всегда беспокоят. Время на форум для вопросов у вас есть, время экспериментировать с кодом, не понимая функций и тратя соответственно на это массу времени у вас есть, а времени зайти на официальный сайт РНР и изучить функции у вас нет. Странно.

Строки и массивы, это типы данных с которыми вам придется сталкиваться постоянно, и не знать функций для работы с этими данными, задавая вопросы по пустячным проблемам, это не похоже на нехватку времени, это нечто другое - это лень. )

Все правильно, так и должно быть, потому как функция str_ireplace (и не только эта из функций обработки строк) зависит от локали. Чтобы она работала корректно не только для английского, но и кириллицы, необходимо установить локаль.
<?
setlocale
(LC_ALL'Russian_Russia.1251');


А чтобы не подсвечивало короткие слова, нужно удалить из массива поиска элементы, длина которых меньше заданной.

Но str_ireplace() не занимается подсветкой, она производит замену, и как сказать, правильным ли будет, если результат поиска изменяет текст оригинала:

Поздравления в Стихах любимого мужчины

Правильно ли удалять "короткие" слова из результата, если это действительно поиск и он производится по логике "И".

  Ответить  
 
 автор: segazav   (05.04.2013 в 15:35)   письмо автору
 
   для: confirm   (05.04.2013 в 11:08)
 

Но ведь можно убрать короткие слова не из результатов поиска, а из ключевой строки, все равно поиск ведется только по словам, а не по целой строке.

  Ответить  
 
 автор: confirm   (05.04.2013 в 16:07)   письмо автору
 
   для: segazav   (05.04.2013 в 15:35)
 

Я не знаю, что такое ключевая строка. Я вообще не понимаю, что на что вы меняете, так как не раз просил это объяснить, показать строки, но результата...

Если вы понимаете что нужно сделать, и то что я написал, это именно то что и нужно, меняйте, удаляйте, я ведь против ничего не имею. Я все пишу основываясь только на своих предположениях.

  Ответить  
 
 автор: segazav   (05.04.2013 в 17:37)   письмо автору
 
   для: confirm   (05.04.2013 в 16:07)
 

Я не понимаю, как удалить короткие символы из строки: $s = "Поздравления в стихах любимого мужчины"; - она и является ключевой и выводится обрезанной не будет, просто по ней идет сравнение с другими строками.

  Ответить  
 
 автор: confirm   (05.04.2013 в 17:43)   письмо автору
 
   для: segazav   (05.04.2013 в 17:37)
 

>"Строки и массивы, это типы данных с которыми вам придется сталкиваться постоянно, и не знать функций для работы с этими данными..."

Коли вы задаете здесь вопросы, то уж точно некоторым временем вы обладаете. Заходим сюда (и желательно почаще сюда заходить), и ищем ответ на вопрос - "как узнать длину строки?"

Это будет первым шагом к решению вашей задачи - Я не понимаю, как удалить короткие символы из строки

Вот только я сомневаюсь, что удалять их надо из строки в которой производится поиск. Но хотение пуще неволи, хотите, ну значит пусть будет так.

Итак - найдите сперва ответ на первый вопрос в руководстве РНР, затем далее.

PS. Коротких символов в природе не существует, они все короткие )

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования