Шаблон регулярного выражения и необязательные совпадения

У меня проблема с шаблоном регулярного выражения и необязательными совпадениями. В основном я пытаюсь извлечь информацию из строки, содержащей рабочее время, которая может быть трех следующих форм:

$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 не совпадают. Я попробовал дополнительную группировку со 2-й временной частью и дополнительным информационным текстом, но она не работает. Вместо этого я получаю пустые спички. Я не вижу недостатка...

Я хотел бы использовать preg_match_all, чтобы получить все вхождения такой вышеуказанной подстроки, потому что это большая строка для каждого дня с понедельника по воскресенье с вышеуказанными подстроками в форме $d1 - $d3 в день. Я не знаю, могу ли я также использовать точку с запятой в качестве маркера конца подстроки, поэтому я пытаюсь сопоставить ее с ([^;]+). Если это не работает, я мог бы выбрать другой разделитель, который отмечает конец подстроки одного дня, и просто сначала разделить большую строку и сопоставить подстроки в цикле.

Я ценю любые намеки! Заранее спасибо за помощь!


person Andreas W. Wylach    schedule 02.11.2012    source источник


Ответы (1)


Я могу ошибаться здесь, но это, кажется, работает:

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

Просто добавил необязательность (вопросительные знаки) для необязательных элементов.

person eis    schedule 02.11.2012
comment
Действительно, это была проблема :-/ Спасибо за помощь :-) - person Andreas W. Wylach; 02.11.2012