Я пытаюсь создать шаблон сопоставления URL-адресов, в котором можно будет прочитать параметры маршрута.

Вот что у меня есть:

$routePattern = '/test/{id}/edit';
// Can I strip the opening and closing bracket from `$0` here?
$regexPattern = '#^' . preg_replace('#{[\w]+}#', '(?P<$0>[\w]+)', $routePattern) . '$#';
// Matching done here...

Проблема в том, что это приведет к: #^test/(?P<{id}>[\w]+)/edit$#. Но я бы хотел убрать скобки с id. Поэтому мне нужен следующий результат: #^test/(?P<id>[\w]+)/edit$#.

Как это возможно в чистом виде? Это не чистый способ, который я нашел:

$routePattern = '/test/{id}/edit';
$regexPattern = '#^' . preg_replace('#{[\w]+}#', '(?P<$0>[\w]+)', $routePattern) . '$#';
$regexPattern = str_replace(['{', '}'], '', $regexPattern);
// Matching done here...
0
Jan Wytze 8 Окт 2018 в 19:08

2 ответа

Лучший ответ

Используйте подшаблон захвата, заключив \w+ в скобки :

preg_replace('#{([\w]+)}#', '(?P<$1>[\w]+)', $routePattern)
1
Matt S 8 Окт 2018 в 16:17

Я бы, вероятно, использовал группу захвата и обратную ссылку, которая:

({)(.)*(})

Должен поймать это. Затем сделайте обратную ссылку с помощью $2 вместо $0

Так..

$regexPattern = '#^' . preg_replace('#({)([\w]+)(})#', '(?P<$2>[\w]+)', $routePattern) . '$#';
// Matching done here...

Как это?

Это отличный ресурс для регулярных выражений: https://regexr.com/

0
Alexandra 8 Окт 2018 в 16:26