获取所有 8 个整数序列的代码可以正常工作:
preg_match_all('/[0-9]{8}/', $string, $match);
但是,我只对比赛以 20 开始感兴趣。
我知道我必须在 ^20
某个地方添加,但我尝试了很多次都没有成功。我看过许多正则表达式教程,但似乎都没有解释如何进行 2 次单独搜索。
我实际上是在尝试解析 ICAL 文件以提取日期。如果 8 位整数以 20 开头,则几乎可以肯定它是一个日期。
例如:DTSTART:20150112T120000Z
这可能会找到您要查找的内容:
(?=20)(\d{8})
20
如果组以 8 位数字开头,则它会进行积极的前瞻来捕获组。
答案在很大程度上取决于您想要实现的目标。您想从 icalendar 文件中提取所有日期吗?如果是这样,您可能会错过生日日期,因为他们的年份最有可能从 19xx 开始。
匹配任何日期也很可能会产生许多不需要的日期,如UNTIL
, TRIGGER
, DTEND
, ...
假设从您的示例中您想要提取事件开始日期,您可以尝试:
DTSTART[a-zA-Z._%+-/=;]*:(\d){8}[T]?[\d]{6}
请记住:以下DTSTART
可以是时区定义,例如TZID=America/New_York
和/或类型定义DATE
或DATE-TIME
(参见RFC5545 DATE-TIME
这个解决方案怎么样:
/(20)\d{6}/