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]   

> Без описания
GoDr
Отправлено: 22 Января, 2018 - 15:21:11
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


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




Есть строка поиска, например, "коров". Есть искомая строка "Корова шла по полю и видела других коров".

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

Проблема поиска и замены не проблема, ну нужно сохранить регистр букв искомой строки.
То есть должно быть к примеру "<b>Коров</b>а шла по полю и видела других <b>коров</b>"

Что-то совсем запутались мозги.. заменяется или всё на "<b>коров</b>" или всё на "<b>Коров</b>"

текст в формате Юникод


-----
Система управления веб-содержимым Lotos CMS
 
 Top
Строитель Модератор
Отправлено: 22 Января, 2018 - 17:18:47
Post Id



Участник


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


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




GoDr пишет:
То есть должно быть к примеру "<b>Коров</b>а шла по полю и видела других <b>коров</b>"
Спойлер (Отобразить)
 
 Top
Quick
Отправлено: 23 Января, 2018 - 10:54:04
Post Id


Новичок


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


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




лучше, наверно, осуществлять поиск в соответствии с регистром (strpos), если найдено "Коров", то менять на один вариант замены, а если "коров", то на другой.
но возможны накладки в случаях, если в тексте будут слова типа: КОРОВ или короВ

(Отредактировано автором: 23 Января, 2018 - 10:55:28)

 
 Top
GoDr
Отправлено: 23 Января, 2018 - 11:24:49
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


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




Вот спасибо... только сейчас понял что нужно использовать найденные переменные в замене... А я использовал $need... Радость

Тема закрыта. Спасибо
(Добавление)
Quick, не надо тут ничего придумывать ))) всё отлично работает... Хорошо

PS
поиск идёт через Ajax, так что при вводе одной фразы должны вываливаться все возможные варианты
(Добавление)
кстати, а не проще вместо preg_quote() использовать \Q...\E ?


-----
Система управления веб-содержимым Lotos CMS
 
 Top
Строитель Модератор
Отправлено: 23 Января, 2018 - 11:44:30
Post Id



Участник


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


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




GoDr пишет:
кстати, а не проще вместо preg_quote() использовать \Q...\E ?
Может быть и проще ) Я не уверен только в одном - как конструкция \Q...\E отреагирует, если в переменную будет передан символ ограничителя pcre-шаблона (в моём примере это тильда ~) ? В функции preg_quote() этот момент учитывается передачей второго аргумента.
(Добавление)
Quick пишет:
лучше, наверно, осуществлять поиск ...
Лучше пользоваться соответствующими для задачи инструментами.
 
 Top
GoDr
Отправлено: 23 Января, 2018 - 11:58:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


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




Я использую #
и твой вариант и мой выкидывает ошибку.. Нахмурился Твоя тильда тоже не спецсимвол )))
Видимо придётся переключиться на звёздочку.. она точно спецсимвол..

И при этом экранирование помогает, а вот \Q\E уже не работает....

в общем вот готовый метод.. может кому пригодиться.. или может кто подправит и оптимизирует
PHP:
скопировать код в буфер обмена
  1.  
  2.     /**
  3.      * Подсветка части текста
  4.      *
  5.      * @param string $str1  : исходная строка
  6.      * @param string $str2  : строка для поиска
  7.      * @param string $class : дополнительный класс CSS
  8.      *
  9.      * @return string : исходная подсвеченная строка
  10.      *
  11.      * @example :
  12.      *          $a = LibText::illumText('Корова видит других коров', 'коров', 'text-info');
  13.      *          // <span class="text-info">Коров</span>а видит других <span class="text-info">коров</span>
  14.      *
  15.      *          $a = LibText::illumText('Корова видит других коров', 'коров');
  16.      *          // <span>Коров</span>а видит других <span>коров</span>
  17.      *
  18.      * @since   1.0 : 23.01.2018 : Gold Dragon
  19.      */
  20.     public static function illumText($str1, $str2 = '', $class = '')
  21.     {
  22.         // добавляем стиль CSS
  23.         $class = (empty($class)) ? '' : ' class=" ' . $class . '"';
  24.         // формируем шаблон
  25.         $str2 = '*' . preg_quote($str2) . '*iu';
  26.         // делаем замену
  27.         $result = preg_replace($str2, '<span ' . $class . '>$0</span>', $str1);
  28.  
  29.         return $result;
  30.     }
  31.  


-----
Система управления веб-содержимым Lotos CMS
 
 Top
Строитель Модератор
Отправлено: 23 Января, 2018 - 12:05:04
Post Id



Участник


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


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




GoDr пишет:
тильда тоже не спецсимвол
Я разве говорил про спецсимволы? ) Я говорил про ограничитель шаблона, коим и является тильда в моём примере, а preg_quote(), помимо спецсимволов, будет экранировать в том числе и тильду, потому что тильда передана в функцию вторым параметром. Посмотрите внимательнее, как это записано в моём примере.
 
 Top
GoDr
Отправлено: 23 Января, 2018 - 12:09:36
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


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




Строитель, не так высказал мысль ))) хотел сказать что и твой (часть его) и мой вариант кода с моими экранами не работает Улыбка

А второй параметр я видел, только у себя убрал и не внимательно протестировал ))) А потом решил просто изначально использовать спецсимвол чтобы "не дёргаться"

(Отредактировано автором: 23 Января, 2018 - 12:11:33)



-----
Система управления веб-содержимым Lotos CMS
 
 Top
Строитель Модератор
Отправлено: 23 Января, 2018 - 12:20:45
Post Id



Участник


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


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




GoDr пишет:
А второй параметр я видел, только у себя убрал
Если шаблон динамический, а у вас он динамический, то не стоит убирать второй параметр из preg_quote().
 
 Top
GoDr
Отправлено: 23 Января, 2018 - 12:34:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


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




Строитель, принял к сведению, спасибо.
Я вот тоже подумал... второй параметр явно указывает на символ экранирования. А у меня понятно что идёт экранирование и понятно что разделитель это спецсимвол, но это не явное указание... Думаю твой пример будет намного правильнее... Читая код нужно сразу понимать что и как, а не додумывать Язычок


-----
Система управления веб-содержимым Lotos CMS
 
 Top
Строитель Модератор
Отправлено: 23 Января, 2018 - 14:19:37
Post Id



Участник


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


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




GoDr пишет:
Читая код нужно сразу понимать что и как, а не додумывать
Верно. Для проверки необходимости экранирования символа-ограничителя динамического шаблона, запустите на локальном сервере сперва этот код:
Спойлер (Отобразить)
А потом этот:
Спойлер (Отобразить)
Думаю, дальше всё станет понятно.
 
 Top
GoDr
Отправлено: 23 Января, 2018 - 15:19:57
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


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




Ну я так и сделал когда тестировал Подмигивание

Единственное, я не учёл защиту от входных данных, т.к. функция принимает и массивы... Ну в принципе в моей библиотеке для работы с массивами есть другая библиотека...


-----
Система управления веб-содержимым Lotos CMS
 
 Top
GoDr
Отправлено: 03 Февраля, 2018 - 13:27:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


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




На всякий случай выкладываю окончательный вариант (... чтоб самому на забыть Радость )
PHP:
скопировать код в буфер обмена
  1.  
  2.     function illumText($str1, $str2 = '', $class = '')
  3.     {
  4.         // Проверка на строку
  5.         if (is_string($str1)) {
  6.             // добавляем стиль CSS
  7.             $class = (empty($class)) ? '' : ' class=" ' . $class . '"';
  8.             // формируем шаблон
  9.             $str2 = '#' . preg_quote($str2, '#') . '#iu';
  10.             // делаем замену
  11.             $result = preg_replace($str2, '<span ' . $class . '>$0</span>', $str1);
  12.             return $result;
  13.         } else {
  14.             return $str1;
  15.         }
  16.     }
  17.  

(Отредактировано автором: 03 Февраля, 2018 - 13:28:22)



-----
Система управления веб-содержимым Lotos CMS
 
 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