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

时间:2012-09-19 11:07:05

标签: php preg-match

有谁知道我收到此错误的原因: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;
    }
}

6 个答案:

答案 0 :(得分:0)

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

$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})$#

只需read the manual about the PCRE-extension

另外两条评论:

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

答案 1 :(得分:0)

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

如果你真的想要匹配斜杠,请使用\/来逃避它

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

你需要逃避斜线,如下:

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

答案 4 :(得分:0)

你没有逃过你的“/”并且你没有完成你的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'));

答案 5 :(得分:0)

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

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