[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Подсветка в результатх поиска
FatCat
Собственно, понадобилось сделать: пользователь вводит поисковый запрос, подсветить его в результатах поиска. Подсвечивать независимо от регистра, но не меняя регистра, поэтому str_ireplace не подошел, пришлось использовать preg_replace и подсовывать в паттерн строку, введенную пользователем.
function txt_replace($repl="", $htm){
if(!$repl)return $htm;
$reg = explode(" ", "\\ ^ . $ | ( ) [ ] { } #");
foreach($reg as $r)$repl = str_replace($r, "\\".$r, $repl);

return preg_replace("#($repl)#i", "<span class=\"searchlite\">\\1</span>", $htm);
}
Вроде работает. Но я не силен в регулярках. Всё ли я учел, чтобы не поломало текст?

_____________
Бесплатному сыру в дырки не заглядывают...
sg.com
В этом месте наоборот выглядит органичнее:
Цитата (FatCat @ 7.05.2016 - 13:05)
function txt_replace($repl="", $htm){

вот так:
Цитата (FatCat @ 7.05.2016 - 13:05)
function txt_replace($htm, $repl=""){

Если $reg будет массивом, то в этой строке что то затеряться может:
$reg = explode(" ", "\\ ^ . $ | ( ) [ ] { } #");
foreach($reg as $r)$repl = str_replace($r, "\\".$r, $repl);

с регуляркой не подскажу, вроде как достаточно.
killer8080
FatCat
пользовательский текст в шаблоне нужно эскейпить preg_quote
Миша
Цитата (killer8080 @ 7.05.2016 - 17:43)
FatCat
пользовательский текст в шаблоне нужно эскейпить preg_quote

Давно хотел спросить, это относится только к шаблону? Входную строку трогать не надо, да?

_____________
Принимаю заказы, писать в ЛС
killer8080
Цитата (Медведь @ 7.05.2016 - 17:50)
Давно хотел спросить, это относится только к шаблону?

естественно
FatCat
killer8080
function txt_replace($repl="", $htm){
return preg_replace("#(".preg_quote($repl, '#').")#i", "<span class=\"searchlite\">\\1</span>", $htm);
}
Спасибо! Так нормально работает, и выглядит опрятнее.

В проекте функция чуть сложней, чтобы еще и внутрь тегов не залезала:
function txt_replace($repl="", $htm=""){
if(!$repl)return $htm;
$repl = preg_quote($repl, '#');

$htm = explode('<', $htm);
foreach($htm as $k=>$v)
{
$v = explode('>', $v);
$v[1] = preg_replace("#($repl)#i", "<span class=\"searchlite\">\\1</span>", $v[1]);
$htm[$k] = implode('>', $v);
}

return implode('<', $htm);
}



Цитата (sg.com @ 7.05.2016 - 15:04)
наоборот выглядит органичнее

Наверное. Но мне проще запомнить, когда порядок как в preg_replace: в начале что заменяем, в конце где заменяем.

_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.