Php 正则表达式中的未知修饰符

Php 正则表达式中的未知修饰符,php,preg-match,Php,Preg Match,有人知道我收到此错误的原因吗:preg_match()[function.preg match]:未知修饰符“(” 使用此方法: 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 t

有人知道我收到此错误的原因吗:
preg_match()[function.preg match]:未知修饰符“(”
使用此方法:

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;
    }
}

您使用
/
作为表达式的分隔符。但是,无论如何,它完全没有必要

$parts = explode('/', $date);
更好的是:

让您了解发生了什么:PCRE正则表达式需要在模式本身的开始和结束处使用分隔符。第二个分隔符之后的所有内容都被视为修饰符。因此,您决定使用
/
作为分隔符(它始终是第一个字符),因此您的模式在
/^([0-9]{2})之后结束/
。接下来的所有内容(首先是
)都被视为修饰符,但
)不是现有的修饰符

如果您想继续使用正则表达式,我建议使用另一个分隔符,如

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

另外两条评论:

  • 在使用之前,您应该定义
    $parts
  • 请记住,该表达式非常不准确,因为它允许像
    33/44/5678
    这样的日期,但拒绝
    1/1/1970

如果第一个字符是斜杠
/
被检测为正则表达式的定界符。因此您的正则表达式只是部分
^([0-9]{2})
。第二个斜杠之后的所有内容都被识别为正则表达式的修饰符


如果确实要匹配斜杠,请使用
\/
将其转义

因为在正则表达式中使用斜杠,需要使用其他分隔符,请尝试:

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)){
您没有转义“/”,也没有完成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'));

您可能想考虑不使用正则表达式。

<?php
// simple example
$timestamp = strtotime('12/30/2012');
if ($timestamp) {
    // valid date… Now do some magic
    echo date('r', $timestamp);
}
if(strotime('08/09/2012')){/*valid*/}
可以替换此选项。