【问题标题】:Using regular expression failed to fetch expected date format使用正则表达式无法获取预期日期格式
【发布时间】:2016-12-08 10:19:16
【问题描述】:

我正在尝试使用正则表达式从文本详细信息中提取日期,但我使用的正则表达式没有返回任何内容。

我用来从字符串中提取日期的 PHP 代码:

<?php 
preg_match("/(\w\w\w)\,(\w\w\w) (\d\d)\,(\d\d\d\d) at (\d\d)\:(\d\d)   ([A|P]M)/", $input_line, $output_array);

?>

输入字符串示例:

kardashian, kim this is dummy text area
mercury, freddie Tue, Aug 23, 2016 at 2:21 PM
22.11.2016 08:58 AM
last_name, first_name
bjorge, philip 

预期输出:

Tue, Aug 23, 2016 at 2:21 PM

请告诉我为什么我的正则表达式不起作用。

提前感谢您的帮助。

【问题讨论】:

  • 密切注意空格(在第一个逗号之后缺少一个,而在 AM/PM 之前有太多空格)。
  • /(\w{3}), (\w{3}) (\d{1,2}), (\d{4}) at (\d{1,2}):(\d{2}) ([AP]M)/ - 长话短说:您的空格不匹配,您预计小时数为 2 位数(在您的示例中只有 1,2:21

标签: php regex date preg-replace preg-match


【解决方案1】:

您可以通过添加空间匹配子模式来修复此表达式,例如\s 匹配任何空白,或\h 仅匹配水平空白:

/\b(\p{L}{3}),\s(\p{L}{3})\s(\d\d),\s(\d{4})\sat\s(\d\d?):(\d\d)\s([AP]M)/
              ^^          ^^       ^^       ^^  ^^                   

regex demo

如果空格是可选的,请在其后添加* 量词。

另外,要匹配TueAug,您可以只使用\p{L}{3} 模式(3 个字母)。你可以写一个更短的\d{4},而不是\d\d\d\d。建议在前面加上\b 单词边界,因为您需要将第一个 3 个字母的单词作为一个完整的单词进行匹配。

另外,[A|P] 匹配 A|P,您需要从字符类中删除 |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 2012-10-09
    • 2012-06-20
    • 1970-01-01
    • 2011-12-31
    相关资源
    最近更新 更多