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
Форумы портала PHP.SU :: Версия для печати :: Подсветка найденных слов
Форумы портала PHP.SU » PHP » Регулярные выражения » Подсветка найденных слов

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

1. paket - 21 Мая, 2012 - 16:29:11 - перейти к сообщению
Пишу поиск на сайте.
Все отлично работает, но вот решил найденные слова подсвечивать, порылся в инете и понял что лучший способ - это regex. Только вот беда, до сих пор не могу въехать не в суть а в правописание.

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

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

В общем устал мучаться с этим ))
2. IllusionMH - 21 Мая, 2012 - 17:30:34 - перейти к сообщению
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 с классом.
3. LIME - 21 Мая, 2012 - 17:45:38 - перейти к сообщению
IllusionMH решение аналогично представленному
только медленнее ))
смысл не учитывать слова внутри тегов
имхо регулярками тут замахаешся парсить
http://sitear[dot]ru/material/php-pa[dot][dot][dot]-simple-html-dom
4. DeepVarvar - 21 Мая, 2012 - 17:55:23 - перейти к сообщению
IllusionMH пишет:
P.S. font уже устарел и запрещен в XHTML и HTML5. Лучше через span с классом.
А можно еще проще в <b></b> а тому уже свои стили прикрутить.
5. IllusionMH - 21 Мая, 2012 - 17:56:23 - перейти к сообщению
LIME, ух как я затупил(даже если и переделал через preg_replace)... *лицовруках* думал только текст(накрайняк bb-коды)
А за ссылочку спасибо Улыбка

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

Так поиск должен осуществляться только по "чистому тексту", каким он берется из БД/файла, а не предварительно обработанный поиском
6. paket - 22 Мая, 2012 - 12:08:48 - перейти к сообщению
Выяснил в чем проблема. Эта проверка происходит в цикле по каждому из поисковых слов. Так вот если первое поисковое слово "эврика" а второе "font" или "class", то первый раз "эврика" обрамляется в теги, а во втором пробеге цикла он находит второе поисковое слово "font" или "class" внутри тега и обрамляет его снова в тег, и получается что тег в теге и это выдается на экран.
Выглядит очень не красиво. В общем как организовать такой цикл?
7. paket - 23 Мая, 2012 - 14:48:30 - перейти к сообщению
Нашел.
Все таки регулярные выражения, используя шаблон:

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

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

 

Powered by ExBB FM 1.0 RC1