1

我目前正在努力解决一个问题:我试图在给定的字符串中找到一个(未知格式的)日期。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.
4

2 回答 2

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}

在此处输入图像描述

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] => 
        )

)

免责声明

这个表达式找不到很多边缘情况。发现后,可以更新此表达式以匹配其他格式。

该表达式还可能捕获实际上不是日期的内容,这是正常的。

于 2013-06-21T16:13:27.123 回答
0

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

于 2013-06-21T14:43:30.023 回答