我目前正在努力解决问题:我正在尝试在给定字符串中找到(未知格式化)日期。到目前为止,我已经为德国日期(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.
答案 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}
输入文字
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)
效果非常好,但您需要使用您已知的日期文本来提供它。