我想检查一个URL(或任何字符串)是否包含以下任何形式的模式 ####-##-##。有没有便于使用的str_replace()或正则表达式来做到这一点?类似于:
contains_date_string($string);
如果 $string 包含 ####-##-##,则返回 true。
谢谢!
contains_date_string($string);
如果 $string 包含 ####-##-##,则返回 true。
谢谢!
if (preg_match('/\b\d{4}-\d{2}-\d{2}\b/', $str)) {
// ...
}
\b
)无法实现,您可以尝试使用负向回顾和预测。if (preg_match('/(?<!\d)\d{4}-\d{2}-\d{2}(?!\d)/', $str)) {
// ...
}
checkdate()
来清除无效日期,例如在此答案中提到的9999-02-31
。preg_match
与checkdate
结合使用:function contains_date($str)
{
if (preg_match('/\b(\d{4})-(\d{2})-(\d{2})\b/', $str, $matches))
{
if (checkdate($matches[2], $matches[3], $matches[1]))
{
return true;
}
}
return false;
}
"This is not 1239202-02-120331231 valid"
。 - Asaph'/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/'
确保像1998-13-32这样的事情不会通过验证。
我从谷歌得到了这个... http://www.devnetwork.net/viewtopic.php?f=29&t=13795
看起来很有前途。希望这能帮助那些在寻找同样问题的人,因为Stackoverflow在SEO方面是最容易访问的地方。
^
和$
)将阻止OP所询问的"包含"操作生效。 - Asaph这里给出的测试应该可以正常工作:
if (preg_match('#[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])#', $str)) {
// do something
}