Кто-нибудь знает, почему я получаю эту ошибку: 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); }