2009-10-14 3 views
0

У меня проблема с PHP PCRE, и я привык к POSIX, поэтому я не слишком уверен в том, что я делаю неправильно. В принципе, эта функция сопоставляет до 10 чисел, разделенных запятыми. Тем не менее, это также соответствует строке sdf (и, возможно, многим другим), о которой я не вижу причины. Может кто-нибудь мне помочь?Проблемы с PHP PCRE

$pattern='^\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?^'; 

$leftcheck=preg_match($pattern, $leftmodules); 
$centercheck=preg_match($pattern, $centermodules); 
$rightcheck=preg_match($pattern, $rightmodules); 

if(!$leftcheck OR !$centercheck OR !$rightcheck) 
{ 
$editpage = $_SERVER['HTTP_REFERER'].'?&error=1'; 
die("Location:$editpage"); 
} 
+0

@ waiwai933: Ваша основная проблема заключается в том, что ваше регулярное выражение заканчивается символом^вместо $ – Asaph

+1

Асафа, В качестве разделителей для регулярного выражения используются морковь. –

+0

Не лучший выбор, учитывая читаемость. – Joey

ответ

3
^\d{1,5}(, *\d{1,5}){0,9}$ 
+0

Возможно, вы должны указать разделители '/.../' в вашем шаблоне. –

0

Я думаю, что если ваш номер только разделенных запятыми что-то вроде этого следует сделать это

$pattern = '^\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5}$'; 
-1

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

$pattern = '/some pattern/'; 

Чтобы соответствовать всему, что вы хотите иметь^в начале и $ в конце. Возможно, это неправильно, поэтому ваш sdf был подходящим.

$pattern = '/^whole pattern match$/'; 

Это немного запутанно, как номера будут разделены. Это запятая или пробел? Оба в порядке? А что? Вот мое лучшее предположение.

$pattern = '/^\d{,5}[, ](\d{,5}[, ]){,9}$/'; 
+0

The^используется как два равных символа. –

+0

Ничего себе, это действительно вводит в заблуждение. –

1

Я предполагаю следующее:

  • пространства может или не может быть там.
  • Номера могут быть любой длины.
  • Разрешены только номера, пробелы и запятые.
  • Пропускные запятые без номера после них разрешены.
  • От 1 до 10 номеров, разделенных запятыми, в порядке.

Учитывая, что:

$pattern = '/^(\d+,* *){1,10}$/'; 

работы.

1

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

\d{0,5}  #\d matches any digit character, while {0,5} means the 
      #preceding character must be repeated between **0** and five times 

Таким образом, ваше регулярное выражение по существу является коротким замыканием. Двигатель видит первый символ вашей строки и говорит: «У вас цифра была повторена 0 раз?» Да, хорошо, это матч!

Смежные вопросы