【问题标题】:PHP regex expression to find if a string contains YYYY-MM-DDPHP正则表达式查找字符串是否包含YYYY-MM-DD
【发布时间】:2012-05-15 14:38:11
【问题描述】:

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

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

类似:

contains_date_string($string);

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

谢谢!!!

【问题讨论】:

  • 你尝试了什么?另外:Google 有很多日期正则表达式的结果。
  • 我不知道如何使用正则表达式。
  • 现在是学习方法的完美时间。
  • 那会让我的生活变得更好!

标签: php regex string date


【解决方案1】:
if (preg_match('/\b\d{4}-\d{2}-\d{2}\b/', $str)) {
    // ...
}

如果单词边界 (\b) 不能解决问题,您可以试试negative lookbehind and lookaheads

if (preg_match('/(?<!\d)\d{4}-\d{2}-\d{2}(?!\d)/', $str)) {
    // ...
}

作为额外的验证,您可以使用checkdate() 清除无效日期,例如9999-02-31,如this answer 中所述。

【讨论】:

    【解决方案2】:

    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 是否比我在下面发布的答案更有效?
    • 这将为这样的输入返回 true:"This is not 1239202-02-120331231 valid"
    • 您的解决方案允许 xxxx-02-31(2 月 31 日),这不是有效日期。
    • @Asaph:是的,错过了 - 修复传入的问题。
    【解决方案3】:

    here 给出的测试应该可以工作:

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

    【讨论】:

    • 这对于像"This is not 99991999-12-01213213 valid"这样的输入将返回true。
    【解决方案4】:
    '/^[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 询问的“包含”操作工作。
    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 2011-07-11
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多