Php регулярное выражение preg_replace с именем захвата не работает

Я хочу выполнить preg_replace для строки и вернуть именованный захват, но именованный захват не отображается. Ниже то, что я сделал …

string = "{hello}/{world}"
string = preg_replace("/\//", "/\/", string)

string = preg_replace("/\{[a-z]+\}/", "(?P<\1>[a-z-]+)", string)

Вышеуказанное должно стать:

(?P<hello>[a-z-]+)\/(?P<world>[a-z-]+)

Но я только получаю:

(?P<>[a-z-]+)\/(?P<>[a-z-]+)

Названный захват не появляется.

редактировать

Я собираюсь:

(?P<{hello}>[a-z-]+)\/(?P<{world}>[a-z-]+)

если я изменю

\1

в

\0

Больше отладки

Проблема с < > в шаблоне замены, если я удаляю их, \ 1 работает нормально, но как мне заставить регулярное выражение увидеть < > В качестве литералов, а не регулярных выражений специальных символов. Я попытался preg_quote и избежать их, не работает. \< вот как я убегаю от них …

-1

Решение

Захватите группу перед использованием:

$string = preg_replace("/\{([a-z]+)\}/", "(?P<$1>[a-z-]+)", $string)
//                  here __^  & __^
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]