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*/}
可以替换此选项。