我正在做这样的事情来准备动态正则表达式。
$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行可以读取大括号之间的值,然后将其用作索引来替换?
答案 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
)