Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Подсветка в результатх поиска
FatCat  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Чеширский кот
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 5911
Пользователь №: 1
На форуме: 10 лет, 10 месяцев, 2 дня
Карма: 125

Не пью :
22 года, 3 месяца, 2 дня


Собственно, понадобилось сделать: пользователь вводит поисковый запрос, подсветить его в результатах поиска. Подсвечивать независимо от регистра, но не меняя регистра, поэтому 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);
}
Вроде работает. Но я не силен в регулярках. Всё ли я учел, чтобы не поломало текст?


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sg.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Пользователь
Сообщений: 121
Пользователь №: 42899
На форуме: 7 месяцев, 10 дней
Карма: 3




В этом месте наоборот выглядит органичнее:
Цитата (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);

с регуляркой не подскажу, вроде как достаточно.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8737
Пользователь №: 26630
На форуме: 5 лет, 9 месяцев, 7 дней
Карма: 591




FatCat
пользовательский текст в шаблоне нужно эскейпить preg_quote
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Медведь  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 2482
Пользователь №: 37963
На форуме: 3 года, 3 месяца, 28 дней
Карма: 27




Цитата (killer8080 @ 7.05.2016 - 17:43)
FatCat
пользовательский текст в шаблоне нужно эскейпить preg_quote

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


--------------------

Заходил 29.09.2016
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8737
Пользователь №: 26630
На форуме: 5 лет, 9 месяцев, 7 дней
Карма: 591




Цитата (Медведь @ 7.05.2016 - 17:50)
Давно хотел спросить, это относится только к шаблону?

естественно
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
FatCat  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Чеширский кот
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 5911
Пользователь №: 1
На форуме: 10 лет, 10 месяцев, 2 дня
Карма: 125

Не пью :
22 года, 3 месяца, 2 дня


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: в начале что заменяем, в конце где заменяем.


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8737
Пользователь №: 26630
На форуме: 5 лет, 9 месяцев, 7 дней
Карма: 591




Цитата (FatCat @ 7.05.2016 - 23:34)
В проекте функция чуть сложней, чтобы еще и внутрь тегов не залезала:

а почему бы не просто
function txt_replace($repl="", $htm){
return preg_replace("#".preg_quote(htmlspecialchars($repl), '#')."#i", "<span class=\"searchlite\">\\0</span>", $htm);
}

PS и подмаска тут лишняя, раз заменяется всё вхождение, это просто напрасный расход памяти , пусть и небольшой.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
FatCat  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Чеширский кот
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 5911
Пользователь №: 1
На форуме: 10 лет, 10 месяцев, 2 дня
Карма: 125

Не пью :
22 года, 3 месяца, 2 дня


Цитата (killer8080 @ 8.05.2016 - 14:43)
почему бы не просто

Поиск может осуществляться и по цифрам.
<span style="font-size: 12pt;">д. 12, кв. 1.</span>
Не хочу получить:
<span style="font-size: <span class="searchlite">12</span>pt;">д. <span class="searchlite">12</span>, кв. 1.</span>


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса