![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
talker |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 5.5.2008 Репутация: нет Всего: нет |
Задача тривиальная - есть текст, ключевая фраза (строка, вводится через форму), нужно в тексте регистронезависимо выделить вхождение ключевой фразы какими-нибудь тэгами (например, <b></b>). Собственно, задачу я решил, но не уверен что такое решение является безопасным. Подскажите, при таком коде можно передать в скрипт такую строку, которая вызовет сбой preg_replace или даже откроет дверь для хакера? Может быть можно решить эту задачу проще?
P.S. Функция str_ireplace не подходит, потому что её нет в php4 |
|||
|
||||
Ипатьев |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
Лично я не слышал о "сбоях в preg_replace" и "дверях для хакера". Обычно эти двери бывают сильно проще.
preg_quote() стоит использовать в любом случае. Правда, я не очень понял смысл вложенного реплейса. |
|||
|
||||
talker |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 5.5.2008 Репутация: нет Всего: нет |
Если скрипту передана строка ($key), содержащая символы #?.*+ и т.д. (которые в принципе могут быть в тексте), то preg_replace в лучшем случае будет ругаться на некорректную регулярку. Собственно от этого и защищаюсь. |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 5 Всего: 39 |
Конструкция preg_replace("#(\W)#", "\\\\1", $key) у вас вообще не пойми что делает.
Затем, используйте $1 вместо \1 это правильнее и удобнее. И как уже сказали пришедший $key пропустите через preg_quote() или еще лучше поместить в регулярном выражении $key между \Q\E. Итого ваш код будет выглядеть так:
Это сообщение отредактировал(а) Pfailed - 12.8.2009, 09:03 |
|||
|
||||
talker |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 5.5.2008 Репутация: нет Всего: нет |
Добавляет к каждому неалфавитно-цифровому символу \, чтобы для регулярки он не стал спецсимволом (если это *+? и т.п.).
Красиво. Спасибо |
||||
|
|||||
Pfailed |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 5 Всего: 39 |
Оказывается \Q\E в php работает чуть менее чем на половину, т.е. не эскейпит делимитр, нужно сказать что в perl это работает. Так что всеже лучше воспользоваться preg_quote() указав второй параметр.
Не работает Это сообщение отредактировал(а) Pfailed - 12.8.2009, 09:15 |
||||
|
|||||
talker |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 5.5.2008 Репутация: нет Всего: нет |
||||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |