我对正则表达式模式和可选匹配有疑问。基本上,我尝试从包含工作时间的字符串中提取信息,可能是以下 3 种形式:
$d1 = 'Fr: 9-12;';
$d2 = 'Mo: 9-12 und 15-18; alle 14 Tage spez. Migräneberatung bis 20 Uhr;';
$d3 = 'Mo: 9-12; alle 14 Tage spez. Migräneberatung bis 20 Uhr;';
$regex = '
/
(Mo|Di|Mi|Do|Fr|Sa|So)+: # day follow by colon
\s+? # a optional space
(\d+)\-(\d+) # time from - to
(?:\s+?und\s+?(\d+)\-(\d+)) # optional time from - to
;
(?:([^;]+)) # optional addt info
/x';
$rc = preg_match_all($regex, $d2, $m);
print_r($m);
字符串$d2
工作没有问题,我得到了所有预期的匹配项,但字符串$d1
并不$d3
匹配。我尝试使用第二个时间部分和附加信息文本进行可选分组,但它不起作用。我得到的是空匹配。我看不到缺陷...
我想preg_match_all
用来获取所有出现的上述子字符串,因为它是周一到周日每天的一个大字符串,上面的子字符串以$d1 - $d3
每天的形式出现。我不知道我是否也可以使用分号作为这个子字符串结束标记,这就是为什么我尝试将它与([^;]+)
. 如果这不起作用,我可以选择另一个分隔符来标记一天子字符串的结束,然后先拆分大字符串并在循环中匹配子字符串。
我很感激任何提示!在此先感谢您的帮助!