4

我想检查一个 URL(或任何字符串)是否包含以下模式的任何形式####-##-##

有没有人有一个方便的 str_replace() 或正则表达式来做到这一点?

就像是:

contains_date_string($string);

如果 $string 包含 ####-##-## 则返回 true

谢谢!!!

4

4 回答 4

3
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中提到的。

于 2012-05-07T02:52:39.490 回答
3

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;
}
于 2012-05-07T02:55:52.160 回答
0
'/^[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 明智的。

于 2012-05-07T02:56:42.600 回答
0

这里给出的测试应该有效:

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 日和愚人节,除非你另有说明......

于 2012-05-07T02:56:44.590 回答