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 :: Поиск и замена подстроки в строке
Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015 Откуда: Тамбов
Помог: 17 раз(а)
Есть строка поиска, например, "коров". Есть искомая строка "Корова шла по полю и видела других коров".
Необходимо найти все регистронезависимые вхождения строки поиска и заменить её на строку, например с определённым классом.
Проблема поиска и замены не проблема, ну нужно сохранить регистр букв искомой строки.
То есть должно быть к примеру "<b>Коров</b>а шла по полю и видела других <b>коров</b>"
Что-то совсем запутались мозги.. заменяется или всё на "<b>коров</b>" или всё на "<b>Коров</b>"
Покинул форум
Сообщений всего: 25
Дата рег-ции: Дек. 2013
Помог: 0 раз(а)
лучше, наверно, осуществлять поиск в соответствии с регистром (strpos), если найдено "Коров", то менять на один вариант замены, а если "коров", то на другой.
но возможны накладки в случаях, если в тексте будут слова типа: КОРОВ или короВ
Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015 Откуда: Тамбов
Помог: 17 раз(а)
Вот спасибо... только сейчас понял что нужно использовать найденные переменные в замене... А я использовал $need...
Тема закрыта. Спасибо (Добавление) Quick, не надо тут ничего придумывать ))) всё отлично работает...
PS
поиск идёт через Ajax, так что при вводе одной фразы должны вываливаться все возможные варианты (Добавление)
кстати, а не проще вместо preg_quote() использовать \Q...\E ?
Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 73 раз(а)
GoDr пишет:
кстати, а не проще вместо preg_quote() использовать \Q...\E ?
Может быть и проще ) Я не уверен только в одном - как конструкция \Q...\E отреагирует, если в переменную будет передан символ ограничителя pcre-шаблона (в моём примере это тильда ~) ? В функции preg_quote() этот момент учитывается передачей второго аргумента. (Добавление)
Quick пишет:
лучше, наверно, осуществлять поиск ...
Лучше пользоваться соответствующими для задачи инструментами.
GoDr
Отправлено: 23 Января, 2018 - 11:58:44
Посетитель
Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015 Откуда: Тамбов
Помог: 17 раз(а)
Я использую #
и твой вариант и мой выкидывает ошибку.. Твоя тильда тоже не спецсимвол )))
Видимо придётся переключиться на звёздочку.. она точно спецсимвол..
И при этом экранирование помогает, а вот \Q\E уже не работает....
в общем вот готовый метод.. может кому пригодиться.. или может кто подправит и оптимизирует
Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 73 раз(а)
GoDr пишет:
тильда тоже не спецсимвол
Я разве говорил про спецсимволы? ) Я говорил про ограничитель шаблона, коим и является тильда в моём примере, а preg_quote(), помимо спецсимволов, будет экранировать в том числе и тильду, потому что тильда передана в функцию вторым параметром. Посмотрите внимательнее, как это записано в моём примере.
GoDr
Отправлено: 23 Января, 2018 - 12:09:36
Посетитель
Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015 Откуда: Тамбов
Помог: 17 раз(а)
Строитель, не так высказал мысль ))) хотел сказать что и твой (часть его) и мой вариант кода с моими экранами не работает
А второй параметр я видел, только у себя убрал и не внимательно протестировал ))) А потом решил просто изначально использовать спецсимвол чтобы "не дёргаться"
Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 73 раз(а)
GoDr пишет:
А второй параметр я видел, только у себя убрал
Если шаблон динамический, а у вас он динамический, то не стоит убирать второй параметр из preg_quote().
GoDr
Отправлено: 23 Января, 2018 - 12:34:48
Посетитель
Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015 Откуда: Тамбов
Помог: 17 раз(а)
Строитель, принял к сведению, спасибо.
Я вот тоже подумал... второй параметр явно указывает на символ экранирования. А у меня понятно что идёт экранирование и понятно что разделитель это спецсимвол, но это не явное указание... Думаю твой пример будет намного правильнее... Читая код нужно сразу понимать что и как, а не додумывать
Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015 Откуда: Тамбов
Помог: 17 раз(а)
Ну я так и сделал когда тестировал
Единственное, я не учёл защиту от входных данных, т.к. функция принимает и массивы... Ну в принципе в моей библиотеке для работы с массивами есть другая библиотека...
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.