RegEx для очистки строки - PullRequest
3 голосов
/ 11 февраля 2010

Этот RegEx предназначен для очистки ввода пользователя из формы поиска.

$query = preg_replace("/[^A-Za-z0-9 _.,*&-]/", ' ', $query);

Мне нужно добавить косую черту как действительный символ, но если я добавлю ее, я получу ошибкуЯ предполагаю, что должен сбежать, но не могу найти, как это сделать

$query = preg_replace("/[^A-Za-z0-9 _.,*&-/]/", ' ', $query); // doesn't works
$query = preg_replace("/[^A-Za-z0-9 _.,*&-//]/", ' ', $query); // doesn't works
$query = preg_replace("/[^A-Za-z0-9 _.,*&-\/]/", ' ', $query); // doesn't works

Использование php

Ответы [ 4 ]

4 голосов
/ 11 февраля 2010

Вы можете использовать что-то другое, кроме /, в качестве разделителя - попробуйте что-то вроде этого:

$query = preg_replace("%[^A-Za-z0-9 _.,*&-/]%", ' ', $query);

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

EDIT

Немного дополнительной информации можно найти по адресу http://www.php.net/manual/en/regexp.reference.delimiters.php (цитата здесь:)

"При использовании функций PCRE требуется, чтобы шаблон был заключен в разделители. Разделителем может быть любой не алфавитно-цифровой символ без обратной косой черты, без пробелов."

4 голосов
/ 11 февраля 2010

Вы должны экранировать дважды - вам нужно создать строку "\/", поэтому обратный слеш должен быть экранирован как "\\/":

$query = preg_replace("/[^A-Za-z0-9 _.,*&\\/-]/", ' ', $query); 

Кроме того, убедитесь, что вы переместили - в конец или избежали этого. Он отличается между двумя символами в наборе символов.

2 голосов
/ 11 февраля 2010
$query = preg_replace("/[^A-Za-z0-9 _.,*&-\/]/", ' ', $query);

будет работать, если вы напишите это в одинарных кавычках, например:

$query = preg_replace('/[^A-Za-z0-9 _.,*&\/-]/', ' ', $query);

Причиной этого является то, что строки, заключенные в ", анализируются для \ n, \ r \ t и т. Д. И $ vars. Таким образом; экранирование / заставляет PHP пытаться найти особое значение для" / ", как в" \ " n "и когда это терпит неудачу, это удаляет обратную косую черту.

Строки, заключенные в ', не анализируются.

1 голос
/ 11 февраля 2010

Чтобы убежать от персонажа, просто поставьте перед ним обратную косую черту; но не забывайте, что вы используете строку в двойных кавычках - что, вероятно, является причиной, которая усложняет задачу: вам, вероятно, придется разделять обратную косую черту.


Другое решение, которое я обычно использую, - это работа с другим разделителем регулярных выражений, которого у вас нет в регулярном выражении. Например, используя #:

$query = preg_replace("#[^A-Za-z0-9 _.,*&-/]#", ' ', $query);

Это должно решить проблему: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...