正则表达式从PHP中的字符串获取日期时间

时间:2014-05-12 13:50:18

标签: php regex

我正在使用正则表达式以正确的格式从字符串中获取日期时间。 如果字符串是2/12/2013 2 : 31 AM,那么我使用下面的代码删除:之前和之后的空格以获取2/12/2013 2:31 AM

$dtTime = preg_replace('/(\s+\:\s+)/', ':', $dtTime);

但是当字符串2/12/2013 2 31 AM获得2/12/2013 2:31 AM时该怎么办? 我尝试使用下面的代码,但没有工作

$dtTime = preg_replace('/[^\/0-9](\d+\s\d+)/', ':', $dtTime)

请注意,日期可能以/-

分隔

上述代码的目的是通过以下方式与字符串分开获取日期和时间:

    $dtime = strtotime($dtTime);
    $rtime = date('H:i:s',$dtime); // 08:50:05
    $rdate = date('Y-m-d',$dtime);

4 个答案:

答案 0 :(得分:1)

您可以执行:

$dtTime  = preg_replace("! (\d+) (: )?(\d+) (A|P)M!", " $1:$3 $4M", $dtTime);

这将使两条线看起来像" 2/12/2013 2:31 AM"

答案 1 :(得分:1)

如果您无法控制原始的打印或书写格式,您只需要准备好处理各种时间和日期格式。寻找广泛用于其中一种的标记(在某种时间后AM / PM,\d{4}是一年,int> 31必须是一年或一分钟或二,/和 - 通常用于日期,:通常与时间一起使用等),以提供您所看到的内容的线索。不要忘记日期和时间可以是任何一种顺序,也可以只有其中一种。如果你不能合理地匹配多种模式中的一种,它就会因为模糊的输入而失败。

你不会用一个正则表达式做到这一点!

答案 2 :(得分:0)

我可能会以不同的方式处理此问题,单独匹配数字组,然后使用/(\d+)|AM|PM/

之类的内容重新格式化回有效日期

Example here

结合preg_match_all(),您可以这样做

$pattern = '/(\d+)|AM|PM/';
$string = '2/12/2013 2 31 AM';

preg_match_all($pattern,$string,$matches);

[0] => Array
    (
        [0] => 2     // month
        [1] => 12    // day
        [2] => 2013  // year
        [3] => 2     // hour
        [4] => 31    // minutes
        [5] => AM    // ante/post meridiem
    )

由此,您可以将结果格式化为您想要的任何内容

答案 3 :(得分:0)

您应该使用本机DateTime类来解释它,然后重新格式化/清理它。它将比正则表达式更好地处理各种输入。扩展程序作者的This book也有助于弄清楚如何最好地处理PHP中的日期和时间。

$dtime = new DateTime($dtTime);
$rtime = $dtime->format('H:i:s'); // 08:50:05
$rdate = $dtime->format('Y-m-d');

如果您的传入格式未发生变化,请使用createFromFormat制作$dtime

$dtime = DateTime::createFromFormat('m/d/Y H : i A', $dtTime);