在字符串中查找未知格式化日期

时间:2013-06-21 14:34:40

标签: php regex preg-match

我目前正在努力解决问题:我正在尝试在给定字符串中找到(未知格式化)日期。到目前为止,我已经为德国日期(dd.mm.yyyy)实施了一个解决方案:

if(preg_match('/\d{2}.\d{2}.\d{4}/',$stringWithDateSomewhere, $date)) {
  $result['date'] = date('Y-m-d', strtotime($date[0]));
}

我可以继续添加几个reg表达式,试图匹配最常见的。问题是:要检查的格式太多,因为它不仅要检查德国日期。

是否有PHP类或函数在字符串中查找日期,例如就像iPhone用电子邮件和网站一样?

$stringWithDateSomewhere的示例:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacus elit, 
dictum quis justo sit amet, sollicitudin malesuada velit. Nunc eget 
tempus ipsum. *19.10.2013* Morbi bibendum vitae lorem non euismod. In 
hac habitasse platea dictumst. Curabitur *2nd February 2011* vitae pellentesque dui,mi.

2 个答案:

答案 0 :(得分:3)

描述

此表达式将捕获示例文本中的两种格式。这不会检查字符串以确保它是有效日期。

  • 匹配31.43.2013这样的格式,其中两个分隔符不是字母或数字且相同
  • 匹配2nd February 2011这样的格式,其中有一个数字,一个月和一个4位数的字符串

\d{1,4}([^a-z0-9])\d{1,4}\1\d{1,4}|\d(st|nd|rd|th)?\s?(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\b\s?\d{4}

enter image description here

PHP代码示例:

输入文字

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam lacus elit, 
dictum quis justo sit amet, sollicitudin malesuada velit. Nunc eget 
tempus ipsum. *19.10.2013* Morbi bibendum vitae lorem non euismod. In 
hac habitasse platea dictumst. Curabitur *2nd February 2011* vitae pellentesque dui,mi.

<强>代码

<?php
$sourcestring="your source string";
preg_match_all('/\d{1,4}([^a-z0-9])\d{1,4}\1\d{1,4}|\d(?:st|nd|rd|th)?\s?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\b\s?\d{4}/im',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

<强>匹配

$matches Array:
(
    [0] => Array
        (
            [0] => 19.10.2013
            [1] => 2nd February 2011
        )

    [1] => Array
        (
            [0] => .
            [1] => 
        )

)

声明

这个表达式找不到大量的边缘情况。发现时,可以更新此表达式以匹配其他格式。

表达式也可能捕获实际上不是日期的东西,这是正常的。

答案 1 :(得分:0)

我认为,当您计划在文本中检测日期时,正则表达式就是答案。您必须手动添加表达式以检测各种格式的日期。 new DateTime($date)效果非常好,但您需要使用您已知的日期文本来提供它。