Неизвестный модификатор в регулярном выражении

Кто-нибудь знает, почему я получаю эту ошибку: preg_match() [function.preg-match]: Unknown modifier '(' используя этот метод:

 function checkFBDateFormat($date) { if(preg_match ("/^([0-9]{2})/([0-9]{2})/([0-9]{4})$/", $date, $parts)){ if(checkdate($parts[2],$parts[1],$parts[3])) return true; else return false; } else { return false; } } 

Вы не избежали своего «/», и вы также не выполнили свои заявления if, пожалуйста, попробуйте следующее:

  function checkFBDateFormat($date) { if(preg_match("/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/", $date, $parts)){ if(checkdate($parts[2],$parts[1],$parts[3])) { return true; } else { return false; } } else { return false; } } echo var_dump(checkFBDateFormat('08/09/2012')); 

Если первый символ, например, косая черта / определяется как разделитель для регулярного выражения. Таким образом, ваше регулярное выражение является только частью ^([0-9]{2}) . И все после второго коса признается модификаторами для регулярного выражения.

Если вы действительно хотите совпадение с чертой, используйте \/ чтобы избежать ее

У вас нет привязанного / в вашем шаблоне:

 preg_match("/^([0-9]{2})/([0-9]{2})/([0-9]{4})$/" // ---------------------^ ^ // --------------------------------+ 

/ используется как разделитель, движок preg предполагает, что шаблон закончился, когда он встречает a, и ожидает, что следующий символ станет модификатором (например, i для случая игнорирования).

Вам следует избегать всех / в вашем шаблоне:

 preg_match("/^([0-9]{2})\\/([0-9]{2})\\/([0-9]{4})$/" 

Или используйте другой разделитель:

 preg_match("@^([0-9]{2})/([0-9]{2})/([0-9]{4})$@" 

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

 preg_match ("#^([0-9]{2})/([0-9]{2})/([0-9]{4})$#", $date, $parts) 

Вам нужно избегать вашей косой черты, например:

 if(preg_match ("/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/", $date, $parts)){ 

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

 $parts = explode('/', $date); 

Еще лучше: http://php.net/datetime.createfromformat

Чтобы дать вам представление о том, что происходит: регулярное выражение PCRE требует разделителя в начале и в конце самого шаблона. Все после второго разделителя рассматривается как модификатор. Таким образом, вы решили использовать / как разделитель (это всегда первый символ), поэтому ваш шаблон закончился сразу после /^([0-9]{2})/ . Все следующее (которое ( сначала) рассматривается как модификатор, но ( не является существующим модификатором.

Если вы хотите остаться с регулярным выражением, я рекомендую использовать другой разделитель, например

 ~^([0-9]{2})/([0-9]{2})/([0-9]{4})$~ #^([0-9]{2})/([0-9]{2})/([0-9]{4})$# 

Просто прочитайте руководство по PCRE

Два дополнительных комментария:

  • Вы должны определить $parts , прежде чем использовать его
  • Помните, что выражение довольно неточно, потому что оно позволяет даты, такие как 33/44/5678 , но отрицает 1/1/1970

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

 <?php // simple example $timestamp = strtotime('12/30/2012'); if ($timestamp) { // valid date… Now do some magic echo date('r', $timestamp); }