【问题标题】:Regular expression needed for date/time validation日期/时间验证所需的正则表达式
【发布时间】:2010-07-25 22:32:29
【问题描述】:

我需要一个用于以下日期/时间格式的 PHP 5 正则表达式:

2010 年 7 月 10 日 15:00

(2位空格3个字符空格4位空格2位冒号2位)

字符大小写无关,只允许输入a-z、0-9、空格、冒号

提前致谢。

【问题讨论】:

标签: php regex preg-match


【解决方案1】:

这完全符合您的规范,允许任何作为月份的值。

如您所见,我已将日期的每个部分分组,以便您轻松重新格式化。

如果字符串不匹配,$m 将为 0。

linux-t77m:/home/vinko$ more preg.php
<?php
$d = "10 Jul 2010 15:00";
$m = preg_match("/(\d{2})\s([a-z]{3})\s(\d{4})\s(\d{2}):(\d{2})/i",$d,&$matches);
print_r($matches);
?>
linux-t77m:/home/vinko$ php preg.php
Array
(
    [0] => 10 Jul 2010 15:00
    [1] => 10
    [2] => Jul
    [3] => 2010
    [4] => 15
    [5] => 00
)

为确保您只有有效月份,您可以使用此正则表达式

$m = preg_match("/(\d{2})\s(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\s(\d{4})\s(\d{2}):(\d{2})/i",$d,&$matches);

但是...现在你只匹配英文月份。

这很快就会变得笨拙。我强烈建议您使用datetime handling library 并让它处理所有这些问题。

【讨论】:

  • 好东西,伙计。这实际上提出了一个很好的观点 - 我怎样才能确保月份是有效的 3 字符月份名称?
  • @GSTAR:如果字符串与正则表达式匹配,则手动检查月份与十二种可能性。
  • 再次欢呼。我会使用那个 datetime 类,但它告诉我它只在 5.3 中启用,我的主机目前不提供。我认为您提供的上述解决方案对我来说很好,我认为除了英文月份名称之外我不需要任何其他东西:)
  • 嗨 Vinko,我怎样才能确保整个模式匹配并且在时间 (15:00) 之后不能添加更多文本?使用上面的表达式,我可以在时间之后添加文本,并且不会出错。
  • @GSTAR: /(\d{2})\s(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\s(\ d{4})\s(\d{2}):(\d{2})$/i
猜你喜欢
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
相关资源
最近更新 更多