PHP正则表达式:查找字符串是否包含YYYY-MM-DD

4
我想检查一个URL(或任何字符串)是否包含以下任何形式的模式 ####-##-##。有没有便于使用的str_replace()或正则表达式来做到这一点?类似于:
contains_date_string($string);

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

谢谢!


你尝试了什么?另外:Google 搜索有很多关于日期正则表达式的结果。 - ccKep
我不知道如何使用正则表达式。 - HandiworkNYC.com
2
所以现在是学习的绝佳时机。 - Mahmoud Al-Qudsi
那会让我的生活好很多! - HandiworkNYC.com
4个回答

3
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

3
请使用preg_matchcheckdate结合使用:
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;
}

有趣的解决方案Kep!谢谢。使用checkdate比我下面发布的答案更有效吗? - HandiworkNYC.com
对于像这样的输入,它将返回true:"This is not 1239202-02-120331231 valid" - Asaph
您的解决方案允许xxxx-02-31(2月31日),这不是一个有效的日期。 - ccKep
@Asaph:啊,我错过了,修复即将到来。 - ccKep

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方面是最容易访问的地方


起始和结束锚点(^$)将阻止OP所询问的"包含"操作生效。 - Asaph

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日和愚人节...

这将返回类似于“这不是99991999-12-01213213有效”的输入的true。 - Asaph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接