Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Подсветка найденных слов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
paket
Отправлено: 21 Мая, 2012 - 16:29:11
Post Id


Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Окт. 2009  


Помог: 0 раз(а)




Пишу поиск на сайте.
Все отлично работает, но вот решил найденные слова подсвечивать, порылся в инете и понял что лучший способ - это regex. Только вот беда, до сих пор не могу въехать не в суть а в правописание.

Подскажите как правильно написать функцию которая заменяет "слово" на "<font style='background-color:#......'> слово </font>"

Пробовал через str_ireplace, однако он ищет совпадения даже в замененном коде, т.е. если в поиске вбить скажем font то, выдаст <<font style='background-color:#......'> слово </font> style='background-color:#......'> слово </font>

В общем устал мучаться с этим ))
 
 Top
IllusionMH
Отправлено: 21 Мая, 2012 - 17:30:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




paket, я бы наверно сделал что-то подобное (не задумываясь)
PHP:
скопировать код в буфер обмена
  1. $searchText //искомый текст
  2. $portText //текст в котором нужно выделить слова
  3. $resultText = implode("<span class='highlighted'>".$searchText."</span>", explode($searchText, $portText));


Но может есть более правильные/быстрые вырианты
preg_replace разве делает замены в уже измененной строке?


P.S. font уже устарел и запрещен в XHTML и HTML5. Лучше через span с классом.

(Отредактировано автором: 21 Мая, 2012 - 17:41:26)

 
 Top
LIME
Отправлено: 21 Мая, 2012 - 17:45:38
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




IllusionMH решение аналогично представленному
только медленнее ))
смысл не учитывать слова внутри тегов
имхо регулярками тут замахаешся парсить
http://sitear[dot]ru/material/php-pa[dot][dot][dot]-simple-html-dom
 
 Top
DeepVarvar Супермодератор
Отправлено: 21 Мая, 2012 - 17:55:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




IllusionMH пишет:
P.S. font уже устарел и запрещен в XHTML и HTML5. Лучше через span с классом.
А можно еще проще в <b></b> а тому уже свои стили прикрутить.
 
 Top
IllusionMH
Отправлено: 21 Мая, 2012 - 17:56:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




LIME, ух как я затупил(даже если и переделал через preg_replace)... *лицовруках* думал только текст(накрайняк bb-коды)
А за ссылочку спасибо Улыбка

paket пишет:
однако он ищет совпадения даже в замененном коде, т.е. если в поиске вбить скажем font то

Так поиск должен осуществляться только по "чистому тексту", каким он берется из БД/файла, а не предварительно обработанный поиском

(Отредактировано автором: 21 Мая, 2012 - 18:02:26)

 
 Top
paket
Отправлено: 22 Мая, 2012 - 12:08:48
Post Id


Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Окт. 2009  


Помог: 0 раз(а)




Выяснил в чем проблема. Эта проверка происходит в цикле по каждому из поисковых слов. Так вот если первое поисковое слово "эврика" а второе "font" или "class", то первый раз "эврика" обрамляется в теги, а во втором пробеге цикла он находит второе поисковое слово "font" или "class" внутри тега и обрамляет его снова в тег, и получается что тег в теге и это выдается на экран.
Выглядит очень не красиво. В общем как организовать такой цикл?
 
 Top
paket
Отправлено: 23 Мая, 2012 - 14:48:30
Post Id


Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Окт. 2009  


Помог: 0 раз(а)




Нашел.
Все таки регулярные выражения, используя шаблон:

$string=preg_replace("/(слово1|слово2|ляляля|слово99)/si","<b>\\1</b>",$string);

Не используя цикл, заменяет совпадения только в нетронутом тексте.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB