У меня проблема с шаблоном регулярного выражения и необязательными совпадениями. В основном я пытаюсь извлечь информацию из строки, содержащей рабочее время, которая может быть трех следующих форм:
$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
в день. Я не знаю, могу ли я также использовать точку с запятой в качестве маркера конца подстроки, поэтому я пытаюсь сопоставить ее с ([^;]+)
. Если это не работает, я мог бы выбрать другой разделитель, который отмечает конец подстроки одного дня, и просто сначала разделить большую строку и сопоставить подстроки в цикле.
Я ценю любые намеки! Заранее спасибо за помощь!