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