Я хочу выполнить 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 и избежать их, не работает. \< вот как я убегаю от них …
Захватите группу перед использованием:
$string = preg_replace("/\{([a-z]+)\}/", "(?P<$1>[a-z-]+)", $string)
// here __^ & __^
Других решений пока нет …