正则表达式模式和可选匹配

时间:2012-11-02 08:06:37

标签: php regex preg-match-all

我遇到了正则表达式模式和可选匹配问题。基本上我尝试从包含工作时间的字符串中提取信息,这可能是以下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每个天。我不知道我是否也可以使用分号作为此子字符串结束标记,这就是我尝试将其与([^;]+)匹配的原因。 如果这不起作用,我可以选择另一个分隔符来标记一天子字符串的结束,然后首先拆分大字符串并在循环中匹配子字符串。

我感谢任何提示!在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我可能在这里错了,但这似乎有效:

$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';

刚为可选元素添加了选项(问号)。