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 » » Вопросы новичков » Поиск и замена подстроки в строке

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

1. GoDr - 22 Января, 2018 - 15:21:11 - перейти к сообщению
Есть строка поиска, например, "коров". Есть искомая строка "Корова шла по полю и видела других коров".

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

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

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

текст в формате Юникод
2. Строитель - 22 Января, 2018 - 17:18:47 - перейти к сообщению
GoDr пишет:
То есть должно быть к примеру "<b>Коров</b>а шла по полю и видела других <b>коров</b>"
Спойлер (Отобразить)
3. Quick - 23 Января, 2018 - 10:54:04 - перейти к сообщению
лучше, наверно, осуществлять поиск в соответствии с регистром (strpos), если найдено "Коров", то менять на один вариант замены, а если "коров", то на другой.
но возможны накладки в случаях, если в тексте будут слова типа: КОРОВ или короВ
4. GoDr - 23 Января, 2018 - 11:24:49 - перейти к сообщению
Вот спасибо... только сейчас понял что нужно использовать найденные переменные в замене... А я использовал $need... Радость

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

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

И при этом экранирование помогает, а вот \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.  
7. Строитель - 23 Января, 2018 - 12:05:04 - перейти к сообщению
GoDr пишет:
тильда тоже не спецсимвол
Я разве говорил про спецсимволы? ) Я говорил про ограничитель шаблона, коим и является тильда в моём примере, а preg_quote(), помимо спецсимволов, будет экранировать в том числе и тильду, потому что тильда передана в функцию вторым параметром. Посмотрите внимательнее, как это записано в моём примере.
8. GoDr - 23 Января, 2018 - 12:09:36 - перейти к сообщению
Строитель, не так высказал мысль ))) хотел сказать что и твой (часть его) и мой вариант кода с моими экранами не работает Улыбка

А второй параметр я видел, только у себя убрал и не внимательно протестировал ))) А потом решил просто изначально использовать спецсимвол чтобы "не дёргаться"
9. Строитель - 23 Января, 2018 - 12:20:45 - перейти к сообщению
GoDr пишет:
А второй параметр я видел, только у себя убрал
Если шаблон динамический, а у вас он динамический, то не стоит убирать второй параметр из preg_quote().
10. GoDr - 23 Января, 2018 - 12:34:48 - перейти к сообщению
Строитель, принял к сведению, спасибо.
Я вот тоже подумал... второй параметр явно указывает на символ экранирования. А у меня понятно что идёт экранирование и понятно что разделитель это спецсимвол, но это не явное указание... Думаю твой пример будет намного правильнее... Читая код нужно сразу понимать что и как, а не додумывать Язычок
11. Строитель - 23 Января, 2018 - 14:19:37 - перейти к сообщению
GoDr пишет:
Читая код нужно сразу понимать что и как, а не додумывать
Верно. Для проверки необходимости экранирования символа-ограничителя динамического шаблона, запустите на локальном сервере сперва этот код:
Спойлер (Отобразить)
А потом этот:
Спойлер (Отобразить)
Думаю, дальше всё станет понятно.
12. GoDr - 23 Января, 2018 - 15:19:57 - перейти к сообщению
Ну я так и сделал когда тестировал Подмигивание

Единственное, я не учёл защиту от входных данных, т.к. функция принимает и массивы... Ну в принципе в моей библиотеке для работы с массивами есть другая библиотека...
13. GoDr - 03 Февраля, 2018 - 13:27:56 - перейти к сообщению
На всякий случай выкладываю окончательный вариант (... чтоб самому на забыть Радость )
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.  

 

Powered by ExBB FM 1.0 RC1