url参数替换的正则表达式

时间:2013-06-06 18:55:54

标签: php regex

我对Regex做的很少,但我知道这比我做的要简单。

给定一个如下所示的网址:

/p1/p2/{p3}/{p4}/.../{pn}

其中{p3}{p4}包含关联数组的键。

我想用大括号中的值替换大括号中的值(更具体地说,是关键数组中以此为键的值)

所以最终会变成

/p1/p2/p3/p4,最终/p1/p2/v3/v4

我想我可以将'{}'替换为空,但我希望替换字符串与原始表达式的内容完全匹配,以便数组中的查找起作用。

我正在使用PHP函数preg_replace

/(\w+)/({\w+})/不太有用......

3 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

http://regexr.com?35522

$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

现场演示:http://ideone.com/bSvOes