<? PHP, REGEX и я. Трагедия в трех действиях - PullRequest
2 голосов
/ 23 мая 2009

долгое время слушатель. Первый раз звонящий ...

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

У меня есть 3 регулярных выражения, которые я хочу создать, и только одно работает правильно.

Теперь я не уверен, связано ли это с тем, что:

  1. Я не понимаю preg_match и Эрег и их коды возврата как я не работал в PHP около 7 года.
  2. Мои регулярные выражения просто неправильно.
  3. Я умственно отсталый.

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

1) Совпадение с любым числом, начинающимся с 2,3,4 или 5, за которым следуют 5 цифр. (Этот, я думаю, работает)

код:

if (!ereg('/[2-5]\d{5}/', $_POST['packageNumber' )
{
   echo "The package number is not the correct format.";
}

2) Совпадение с любым числом, начиная с 2,3,4 или 5, затем 5 цифр, затем точка, затем 1 или 2.

if (!ereg("/[2-5]\d{5}\.[1-2]/", $_POST['packageModifier' )
{
   echo "The package modifier is not the correct format.";
}

3) Подберите любую комбинацию буквенно-цифровых символов, пробелов, точек и переносов длиной до 50 символов.

if (!ereg("/[0-9a-zA-Z\s\-\.]{0,50}/", $_POST['customerNumber' )
{
   echo "The customer number is not the correct format.";
}

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

Ответы [ 5 ]

8 голосов
/ 23 мая 2009

Вы смешиваете функции PCRE и Функции регулярного выражения POSIX . Вы используете Perl-совместимое регулярное выражение с функцией регулярного выражения POSIX.

Итак, замените ereg на preg_match, и оно должно работать:

if (!preg_match('/^[2-5]\d{5}$/', $_POST['packageNumber'])) {
    echo "The package number is not the correct format.";
}
if (!preg_match("/^[2-5]\d{5}\.[1-2]$/", $_POST['packageModifier'])) {
    echo "The package modifier is not the correct format.";
}
if (!preg_match("/^[0-9a-zA-Z\s\-.]{0,50}$/", $_POST['customerNumber'])) {
    echo "The customer number is not the correct format.";
}

Наряду с исправлением синтаксических ошибок PHP, я добавил якоря для начала (^) и конца ($) строки для сопоставления.

1 голос
/ 23 мая 2009

При использовании регулярных выражений POSIX ( устарело в PHP 5.3 ) вы должны писать тесты следующим образом:

if (ereg('^[2-5][0-9]{5}$', $_POST['packageNumber']) === false)
{
   echo "The package number is not the correct format.";
}

if (ereg('^[2-5][0-9]{5}\\.[1-2]$', $_POST['packageModifier']) === false)
{
   echo "The package modifier is not the correct format.";
}

if (ereg('^[[:alnum:][:space:].-]{0,50}$', $_POST['customerNumber']) === false)
{
   echo "The customer number is not the correct format.";
}

Обратите внимание, что я закрепил регулярные выражения - в противном случае customerNumber всегда будет совпадать (с совпадением нулевой длины).

Для получения дополнительной информации см. Справочную страницу для регулярных выражений POSIX *

.
1 голос
/ 23 мая 2009

Я предполагаю, что вы только что пропустили закрытие] на $ _POSTS, и я добавил якоря для начала и конца строк и использовал preg_match.

Если вы не привязываете его и шаблон соответствует где-либо в строке, тогда все будет соответствовать. Например.

«dfasfasfasfasf25555555as5f15sdsdasdsfghfsgihfughd54» будет соответствовать, если первый не был привязан.

Номер один

if (!preg_match('/^[2-5]\d{5}$/', $_POST['packageNumber'])) {
 echo "The package number is not the correct format.";
}

Номер два

if (!preg_match('/^[2-5]\d{5}\.[2-5]$/', $_POST['packageModifier'])) {
  echo "The package modifier is not the correct format.";
}

Номер три

if (!preg_match('/^[0-9a-zA-Z\s\-.]{0,50}$/m', $_POST['customerNumber'])) {
 echo "The package modifier is not the correct format.";
}
1 голос
/ 23 мая 2009

Вам не нужно привязывать регулярные выражения?

Otheriwse '111111111111111211111111111' будет совпадать с

0 голосов
/ 23 мая 2009
preg_match('/^[2-5]\d{5}$/', $str); // 1-st
preg_match('/^[2-5]\d{5}\.[1-2]$/', $str); // 2-nd
preg_match('/^[0-9a-z\s\-\.]{0,50}$/i', $str); // 3-rd

Ваши ошибки:

  1. вы не избежали косой черты и, наконец, регулярное выражение "\ d" означает просто "d", но "\ d" означает "\ d".
  2. Вы должны были привязать regesp к началу и концу всей строки символами ^ и $.

Вот и все;)

PS: лучше использовать одинарные кавычки для строковых литералов - они быстрее и безопаснее ...

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