'& "внутри регулярного выражения php - PullRequest
1 голос
/ 11 сентября 2010

Будет ли это правильное регулярное выражение, чтобы разрешить A-Z a-z 0-9 и символы #&()-\;,.'" и пробелы?

Я борюсь с ' и " внутри регулярного выражения. Что я сделал правильно? Обратите внимание на \' и \". Это просто не кажется правильным. Какой правильный способ сделать это?

if (preg_match('/^[a-z0-9#&()-\;,.\'\" ]+$/i', $username) )   
{   
    echo "Good";   
}   
else   
{   
    echo "Bad";   
} 

Ответы [ 2 ]

2 голосов
/ 11 сентября 2010

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

'/^[a-z0-9#&()\-\\\\;,.\'" ]+$/i'

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

'/^[-a-z0-9#&()\\\\;,.\'" ]+$/i'

* \\\\; уменьшено до \\; PHP до того, как механизм регулярных выражений увидит его. Затем механизм регулярных выражений уменьшает \\; до \;. Таким образом, четыре обратные косые черты! Единственная обратная косая черта \; становится просто ;. То же самое относится к \\; - PHP уменьшает его до \;, а затем механизм регулярных выражений интерпретирует \; как простую точку с запятой ;. Подойдет не менее четырех.

† На самом деле я солгал. Вы можете уйти с тремя обратными слешами. Но затем вы немного злоупотребляете снисходительностью парсера PHP. Четверо определенно лучше.

0 голосов
/ 11 сентября 2010

Скобки также необходимо экранировать

'/^[a-z0-9#&\(\)\-;,.\'" ]+$/i'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...