2016-08-05 41 views
-1

我想对字符串执行preg_replace并返回命名捕获,但命名的捕获不显示。下面是我做了什么......Php正则表达式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工作正常,但如何让我的正则表达式看到<>为文字而不是regex的特殊字符。我尝试preg_quote并逃脱他们,不工作。 \ <是我如何逃脱他们...

+0

它看起来像你的'[A-Z] +'是不是在一个捕获组。尝试用括号围绕它。 – jrahhali

+0

我只是这样做,仍然没有工作... –

+0

双引号文字中的\ 1不是反向引用。您必须将替换和正则表达式模式放在单引号文字中。是的,添加一个捕获组。 –

回答

0

捕获组在使用它之前:

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