我想检查一个 URL(或任何字符串)是否包含以下模式的任何形式####-##-##
有没有人有一个方便的 str_replace() 或正则表达式来做到这一点?
就像是:
contains_date_string($string);
如果 $string 包含 ####-##-## 则返回 true
谢谢!!!
if (preg_match('/\b\d{4}-\d{2}-\d{2}\b/', $str)) {
// ...
}
如果单词边界 ( \b
) 不能解决问题,您可以尝试消极的lookbehind 和lookaheads:
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;
}
'/^[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 明智的。
这里给出的测试应该有效:
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
}
无论您选择什么正则表达式,都要小心!当机器看到 2004-04-01 时,它无法区分 1 月 4 日和愚人节,除非你另有说明......