我对Regex做的很少,但我知道这比我做的要简单。
给定一个如下所示的网址:
/p1/p2/{p3}/{p4}/.../{pn}
其中{p3}
,{p4}
包含关联数组的键。
我想用大括号中的值替换大括号中的值(更具体地说,是关键数组中以此为键的值)
所以最终会变成
/p1/p2/p3/p4
,最终/p1/p2/v3/v4
我想我可以将'{}'
替换为空,但我希望替换字符串与原始表达式的内容完全匹配,以便数组中的查找起作用。
我正在使用PHP函数preg_replace
。
/(\w+)/({\w+})/
不太有用......
答案 0 :(得分:1)
这样的事情怎么样:
$yourNewString = preg_replace("/{(p[0-9]*)}/g", "$1", $yourString);
对于你的“终极”解决方案,我认为你需要超过1个正则表达式来运行字符串。正则表达式是关于获得某种模式并用它替换某些东西。现在,您希望将几个不同的字符串专门转换为其他字符串。
我认为你可能会更好地使用一个好的'str_replace()
或者爆炸并逐个检查它们。
答案 1 :(得分:0)
虽然我不确定我是否正确解析了您的问题,但这可能是一个可能的解决方案:
$pattern = "/p1/p2/{p4}/{p5}/foo/bar/baz";
$values = array(
'p4' => 'eggs',
'p5' => 'spam',
);
$pattern_fixed = preg_replace_callback("#{(.*?)}#", function ($match) use ($values) {
return isset($values[$match[1]]) ? $values[$match[1]] : $match[1];
}, $pattern);
var_dump($pattern_fixed);
输出:
string(28) "/p1/p2/eggs/spam/foo/bar/baz"
答案 2 :(得分:0)
很有可能你可以实现没有正则表达式
$str = "/p1/p2/{p4}/{p5}/foo/bar/baz";
$repl = array(
'{p4}' => 'v3',
'{p5}' => 'v4',
);
echo str_replace(array_keys($repl), array_values($repl), $str). "\n";
请注意,str_replace也接受数组作为搜索和替换参数。
<强>输出:强>
/p1/p2/v3/v4/foo/bar/baz