2011-02-07 42 views
1

我使用正则表达式如下在dd/mm/yyyy格式分析日期:正则表达式问题在PHP

^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$

我检查它strfriend,这一切看起来确定。然而,在PHP与preg_match它测试时,它不承认它:

if(!preg_match("/^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$/",trim($_POST['dob']))){ 
    $error .= "You must enter a valid date of birth."; 
} 

这种情况与输入如29/10/198701-01-2001,我不知道为什么它不工作!

我也得到了以下警告:

Warning: preg_match() [function.preg-match]: Unknown modifier '.' in /home/queensba/public_html/workers/apply.php on line 18

这我不知道如何解释。

回答

4

如果你在正则表达式中使用'/',你可能不会用它开始/结束正则表达式。例如,用'#'代替它。

if(!preg_match("#^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$#",trim($_POST['dob']))){ 
    $error .= "You must enter a valid date of birth."; 
} 

(顺便说一句,Modifiers会来最终delimiter“#”之后,所以该警告出现,因为PHP认为第二个“/”后的正则表达式将结束。)

+0

它是如何通过`“\ d”`作为其未知的转义序列? – sln 2011-02-07 21:52:53

+0

``\\ d“`也应该有效。像下面的`\ /`一样,`\ d`不是作为php转义序列存在的,因此它对于正则表达式引擎保持esacped。 – giraff 2011-02-08 09:44:36

2

/你的正则表达式的行程内因为PHP认为它们是你的正则表达式分隔符。

尝试

if(!preg_match("#^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$#",trim($_POST['dob']))){ 
    $error .= "You must enter a valid date of birth."; 
} 
1

由于您使用/.../的模式定界符就需要逃跑的所有其他实例/像\ /替代方法是使用一个不同的分隔符喜欢〜

+0

`\ /`不会在他的双引号字符串 – sln 2011-02-07 21:49:33

1

不要对字符串使用双引号,而是用于模板。 如果模式中有'/',则不能以相同的字符开头和结尾,使用“%”,“#”或任何其他字符来执行... 如果您有unicode字符串,则必须使用“u”标志。