正则表达式使用动态命名子模式?

时间:2014-05-23 06:51:05

标签: regex

我正在做这样的事情来准备动态正则表达式。

$mapping = "asa/user/{u}/d/{d}/{f}"; //line 1
$mapper = preg_replace('/\{.*?\}/m','(\w+)',str_replace('/','#',$mapping));     //line 2     
preg_match("/".$mapper."/",str_replace('/','#',$input),$arr);
print_r($arr);

为$ input = / asa / user / ZZA / d / asasa / gh提供这样的输出

Array ( [0] => asa#user#ZZA#d#asasa#gh [1] => ZZA [2] => asasa [3] => gh )

我想要的是得到这样的东西。

 Array ( [u] => ZZA [d] => asasa [f] => gh )

我知道我可以使用?P来做到这一点,所以试试这个

 $mapper = preg_replace('/\{.*?\}/m','(?P<name>\w+)',str_replace('/','#',$mapping)); 

这显然不会起作用,因为它将为所有参数使用相同的索引名称,我需要做的是动态地用u,d,f替换名称。 我可以通过爆炸来实现这一点,我相信,然后遍历阵列并逐个替换。但有没有更好的解决方案来做这种类型的操作?

在第2行可以读取大括号之间的值,然后将其用作索引来替换?

1 个答案:

答案 0 :(得分:1)

  

在第2行可以读取大括号之间的值,然后将其用作索引   替换为?

是的,通过捕获论坛() backrefrences $ n

您应该将第二行更改为:

$mapper = preg_replace('/\{(.*?)\}/m','(?P<$1>\w+)', str_replace('/','#',$mapping));

结果是:

Array
(
    [0] => asa#user#ZZA#d#asasa#gh
    [u] => ZZA
    [1] => ZZA
    [d] => asasa
    [2] => asasa
    [f] => gh
    [3] => gh
)