Я заметил странное поведение с регулярным выражением PCRE, которое не могу объяснить. Я бы ожидал код:
preg_match('!^.+?(?:/programs/([^?#]+))?.*?$!',
'http://example.com/programs/drive', $matches);
чтобы вернуть «диск» как совпадение 1. [^?#]+
и ?
после группы без захвата являются жадными, так почему [^?#]+
не имеет приоритета и не соответствует drive
? Вместо этого тестирование показало, что .+?
в начале соответствует h
, а .*?
в конце соответствует остальной части URL.
Напротив, код:
preg_match('!^.+?(?:/programs/([^?#]+).*)?$!',
'http://example.com/programs/drive', $matches);
работает как положено и возвращает drive
как совпадение 1.