Почему этот PHP не проверяется? - PullRequest
2 голосов
/ 12 апреля 2010
<?php
$username = "@#*(#(*#($&*#$";

if (preg_match("/^[0-9a-z-A-Z-_@ !]*/", $username)) 
{
   echo "true";
} else {
   echo "false";
}
?>

Ответы [ 6 ]

2 голосов
/ 12 апреля 2010

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

'/^[0-9a-zA-Z_@ !-]*$/'

Но помните, что он все равно будет соответствовать пустой строке; если вы хотите предотвратить это, вы должны изменить * на +.

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

«Дополнительные» дефисы в вашем регулярном выражении фактически рассматривались как буквальные дефисы, потому что они не могли образовывать диапазоны там, где были - в каждом случае предыдущий символ уже был частью диапазона. Однако не стоит полагаться на такое поведение; не все регулярные выражения столь же прощающие, как PHP. И, конечно, выглядит как ошибка для любого, кто читает ваш код.

1 голос
/ 12 апреля 2010

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

if(preg_match('/^[0-9a-zA-Z\-_@ !]*$/', $username)
1 голос
/ 12 апреля 2010

Две вещи:

  1. - в пределах [...] - это специальный символ, обозначающий диапазон и должен быть экранирован;и

  2. \w - это сокращение для [A-Za-z0-9_].Вы должны использовать его (хотя его использование технически здесь не проблема).

Итак:

if (preg_match('/^[\w\-@ !]*/', $username))
1 голос
/ 12 апреля 2010

Здесь есть проблема: Z-_, потому что есть -, это означает "символы от z до _. Правильное регулярное выражение /^[0-9a-zA-Z\-_@ !]*/, обратная косая черта -.

0 голосов
/ 12 апреля 2010

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

/^[0-9a-z-A-Z-_@ !]*$/
0 голосов
/ 12 апреля 2010

Вы, вероятно, хотели поставить свою каретку внутри квадратных скобок, вот так

if (preg_match("/[^0-9a-z-A-Z-_@ !]*/", $username)) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...