使用此格式的时间戳的正则表达式YYYYmmddHHMMSS

时间:2017-02-09 09:05:14

标签: php regex

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

$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日不应该匹配
  • 2003年2月29日的日期不应该与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格式的日期(来自   1/1/1600 - 12/31/9999)。这些日子在给定的月份和   年。从1600-9999开始,所有4位数年份的闰年均经过验证。   天和月必须是1或2位数,并且可能具有前导零。   年份必须是4位数年份,介于1600和9999之间。日期分隔符   必须是斜杠(/)

如何调整此正则表达式以匹配我查找的格式:YYYYmmddHHMMSS

1 个答案:

答案 0 :(得分: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)

请参阅doc:checkdate