未知修饰符'('使用带有REGEX表达式的preg_match()时

时间:2011-03-01 10:31:33

标签: php regex

我正在尝试使用preg_match()使用PHP验证DD / MM / YYYY等日期。这就是我的REGEX表达式:

$pattern = "/^([123]0|[012][1-9]|31)/(0[1-9]|1[012])/(19[0-9]{2}|2[0-9]{3})$/";

但是使用正确值,我收到此消息:

  

preg_match():未知修饰符'('

完整代码:

    $pattern = "/^([123]0|[012][1-9]|31)/(0[1-9]|1[012])/(19[0-9]{2}|2[0-9]{3})$/";
    $date = "01/03/2011";

    if(preg_match($pattern, $date)) return TRUE;

提前谢谢

5 个答案:

答案 0 :(得分:12)

将表达式中的/个字符转义为\/

$pattern = "/^([123]0|[012][1-9]|31)\/(0[1-9]|1[012])\/(19[0-9]{2}|2[0-9]{3})$/";

正如其他答案所指出的那样,使用表达式中未使用的另一个分隔符(例如~)可以更好地避免“倾斜牙签”效应,从而使其难以阅读。

答案 1 :(得分:2)

你的分隔符是/,但你在模式本身内部使用它。 使用不同的分隔符,或转义/

答案 2 :(得分:2)

您使用/作为分隔符,也使用表达式。现在

/^([123]0|[012][1-9]|31)/

“完整”表达式和所有后续内容是否需要作为修饰符,也是(

您可以简单地使用其他分隔符。

~^([123]0|[012][1-9]|31)/(0[1-9]|1[012])/(19[0-9]{2}|2[0-9]{3})$~

或者你逃避表达式中/的所有出现,但我更喜欢另一个分隔符;)它更具可读性。

答案 3 :(得分:1)

你可以按照建议逃避斜杠/。不过,它最终会导致Leaning Toothpick Syndome

通常使用不同的分隔符来保持正则表达式的清洁:

// Using "=" as delimiter
preg_match('=^ ... / ... $=', $input);

答案 4 :(得分:0)

使用以下功能的checek日期

 function checkDateFormat($date)
    {
      //match the format of the date
      if (preg_match ("/^([0-9]{2}) \/([0-9]{2})\/([0-9]{4})$/", $date, $parts))
      {
        //check weather the date is valid of not
        if(checkdate($parts[2],$parts[1],$parts[3]))
          return true;
        else
         return false;
      }
      else
        return false;
    }

echo checkDateFormat("29/02/2008"); //return true
echo checkDateFormat("29/02/2007"); //return false