PHP и вопрос регулярных выражений? - PullRequest
0 голосов
/ 18 марта 2010

Мне было интересно, являются ли приведенные ниже коды правильным способом проверки адреса улицы, адреса электронной почты, пароля, города и URL-адреса с помощью preg_match с использованием регулярных выражений?

А если нет, то как мне исправить код preg_match?

 preg_match ('/^[A-Z0-9 \'.-]{1,255}$/i', $trimmed['address']) //street address
 preg_match ('/^[\w.-]+@[\w.-]+\.[A-Za-z]{2,6}$/', $trimmed['email'] //email address
 preg_match ('/^\w{4,20}$/', $trimmed['password']) //password
 preg_match ('/^[A-Z \'.-]{1,255}$/i', $trimmed['city']) //city
 preg_match("/^[a-zA-Z]+[:\/\/]+[A-Za-z0-9\-_]+\\.+[A-Za-z0-9\.\/%&=\?\-_]+$/i", $trimmed['url']) //url

Ответы [ 4 ]

1 голос
/ 18 марта 2010

Это кажется мне слишком сложным. В частности, я вижу несколько вещей, которые не будут работать:

  1. Ваше регулярное выражение будет недоступно для городов с буквами, не входящими в ASCII, например, " Мальмё " или 서울 и т. Д.
  2. Ваш валидатор паролей не позволяет использовать пробелы в пароле (что полезно для ввода парольных фраз), он даже не допускает цифр или знаков препинания, которые многие люди хотели бы ввести в свои пароли для дополнительной безопасности.
  3. Ваш адресный валидатор не пускает людей, которые живут в квартирах (Foo St 12/345)

(предполагается, что вы имели в виду "\." Вместо ".", Поскольку "." Соответствует чему угодно)

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

Например, с адресами электронной почты: просто потому, что адрес действителен в соответствии со стандартом RFC, не означает, что вы действительно сможете отправлять на него электронную почту (или что это правильный адрес электронной почты) для человека). Единственный надежный способ подтвердить адрес электронной почты - это отправить ему электронное письмо и заставить человека нажать на ссылку или что-то в этом роде.

То же самое и с URL: просто потому, что он действителен в соответствии со стандартом, на самом деле не означает, что там есть веб-страница. Вы можете проверить URL, попытавшись выполнить фактический запрос на получение страницы.

Но мое личное предпочтение состояло бы в том, чтобы просто сделать возможный абсолютный минимум проверки и оставить все как есть. Пусть люди редактируют свой профиль (или что-то еще, что вы проверяете) на случай, если они допустят ошибку.

1 голос
/ 18 марта 2010

Ваш уличный адрес: ^[A-Z0-9 \'.-]{1,255}$

  • вам не нужно избегать одинарных кавычек.
  • , так как у вас есть dot в символе класс, это позволит все символы (кроме новая линия). Так эффективно ваше регулярное выражение становится ^.{1,255}$
  • вы позволяете ему быть минимальным длина 1 и максимальная длина 255. Я предложил бы вам увеличить мин длина более чем 1.

Регулярное выражение вашей электронной почты: ^[\w.-]+@[\w.-]+\.[A-Za-z]{2,6}$

  • снова у вас есть . в полукоксе учебный класс. исправить это.

Ваш пароль регулярное выражение: ^\w{4,20}$

  • допускает пароль от 4 до 20 и может содержать только алфавиты (верхний и ниже), цифры и подчеркивание. Я бы предложил вам разрешить специальный символ тоже .. чтобы сделать ваш пароль надежнее.

Регулярное выражение вашего города: ^[A-Z \'.-]{1,255}$

  • имеет . в классе символов
  • допускается минимальная длина 1 (если вы хотите чтобы разрешить городам длиной 1 символ в порядке).

EDIT:

Поскольку вы новичок в регулярных выражениях, потратьте некоторое время на Regular-Expressions.info

0 голосов
/ 18 марта 2010

Пожалуйста, не думайте, что вы знаете, как составлен адрес. Тысячи городов, поселков и деревень с такими же символами, как &, и других алфавитов.

Просто НЕ пытайтесь проверить адрес, если вы не делаете это через API, специфический для страны (например, USPS для США).

А зачем вам ограничивать количество символов в пароле пользователя? У вас нет ЛЮБЫХ требований к паролю, за исключением того, что он существует.

Ваш сайт будет недоступен, если вы используете эти регулярные выражения.

0 голосов
/ 18 марта 2010

На самом деле нет «правильного» способа проверить любую из этих вещей. Это зависит от ваших требований.

Для адресов электронной почты и URL я бы рекомендовал использовать filter_var вместо регулярных выражений - просто передайте его FILTER_VALIDATE_EMAIL или FILTER_VALIDATE_URL.

С другими регулярными выражениями вам нужно убедиться, что вы сбежали. внутри классов персонажей (в противном случае это разрешит все), и вы можете подумать, что классы City / Street допускают мусор, такой как ''''', или просто пробел.

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