【问题标题】:Regexp for a timestamp with this format YYYYmmddHHMMSS [duplicate]具有此格式 YYYYmmddHHMMSS 的时间戳的正则表达式 [重复]
【发布时间】:2017-02-09 09:05:14
【问题描述】:

我有一个包含一组时间戳的文件,我正在寻找一种方法来过滤它们并使用正则表达式从格式良好的格式中找到错误的格式:

$line = array(20171203124500,20150120183045,20140621064431);
$args = array('filter' => FILTER_VALIDATE_REGEXP,
              'options' => array('regexp' => 'REGEX-HERE'), );
$result = filter_var_array($line, $args);
var_dump($result);

我也想检查一下日期是否正确:

  • 4 月 31 日的日期不应匹配
  • 日期 29/02/2003 不应该匹配,而 29/02/2004 应该匹配。

我有这样的表达:

^(?:(?:(?:0?[1-9]|1\d|2[0-8])\/(?:0?[1-9]|1[0-2]))\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$|^(?:(?:(?:31\/0?[13578]|1[02])|(?:(?:29|30)\/(?:0?[1,3-9]|1[0-2])))\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$|^(?:29\/0?2\/(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26]))))$

但它是针对这种格式的日期给出的:31/01/2001

此表达式验证巴西 d/m/y 格式的日期(从 1600 年 1 月 1 日 - 9999 年 12 月 31 日)。对给定月份的天数进行验证,并且 年。闰年适用于从 1600 到 9999 的所有 4 位数年份。 日期和月份必须是 1 或 2 位数字,并且可以有前导零。 年份必须是 4 位数年份,介于 1600 和 9999 之间。日期分隔符 必须是斜杠 (/)

如何调整这个正则表达式以匹配我寻找的格式:YYYYmmddHHMMSS

【问题讨论】:

  • 只交换日期和年份部分。
  • @Toto 这个问题不是重复的,你提到的那个根本不是我要找的
  • @JavaQueen:正则表达式取自my old Java answer,没有任何参考。我不会为此给 Rarasen 任何代表点数。我会完全删除这篇文章。

标签: php regex


【解决方案1】:

正则表达式应该是:

(?:(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:[01][0-9]|2[0-8])))))(?:0[0-9]|1[0-9]|2[0-3])(?:[0-5][0-9]){2}

要知道日期是否有效,您需要使用checkdate($month, $day, $year)

见文档:checkdate

【讨论】:

  • 太棒了!这非常完美。谢谢你。 @Rarasen
  • @JavaQueen:真的有用吗?您提到20000229 不应该是有效的,它对上面的正则表达式是有效的。见regex101.com/r/pIW9DU/1
  • 您无法使用正则表达式验证日期。您需要仔细检查:首先使用正则表达式的结构,然后使用 checkdate 确定有效日期。
  • 是的,它工作正常。 20000229 是正确的。我编辑了问题 20030229 不应该和 20040229 应该。
  • @Rarasen 我会同时使用这两种方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多