Вы предлагаете, что если вы передадите регулярное выражение (?P<id>\d*)(/(?P<title>.*))?
функции вместе с параметрами id=4
и title=''
, функция вернет 4
. И это будет работать для любого регулярного выражения. Это просто невозможно. Ваше регулярное выражение является примером, который такая функция никогда не сможет поддерживать.
Если вы вызовете preg_match с регулярным выражением в строке 4
, то результаты совпадения вернутся 4
для группы захвата id
и пустая строка для группы захвата title
. Если вы вызовете preg_match с тем же регулярным выражением для строки 4/
, то результаты совпадения также будут 4
для группы захвата id
и пустая строка для группы захвата title
. PHP не различает группы захвата, которые соответствуют пустой строке, и группы захвата, которые вообще не участвуют в регулярном выражении. Оба возвращают пустую строку. Обратите внимание, что в своем регулярном выражении вы не только сделали группу необязательной с вопросительным знаком, но .*
внутри вашей группы захвата также необязательна.
Таким образом, у нас есть два возможных совпадения 4
и 4/
, для которых preg_match возвращает 4
для группы захвата id
и пустую строку для группы захвата title
. Итак, как запрашиваемая обратная функция должна определять, должна ли она возвращать 4
или 4/
для двух групп захвата? Это невозможно сделать без дополнительной информации.
На самом деле, понимаете ли вы, что ваше регулярное выражение также соответствует /
и пустой строке? Все в вашем регулярном выражении не является обязательным!