0

我对 Regex 所做的很少,但我知道这必须比我做的更简单。

给定一个如下所示的 URL:

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

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

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

所以这最终变成

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

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

我正在使用 PHP 函数preg_replace

/(\w+)/({\w+})/不太行……

4

3 回答 3

1

像这样的东西怎么样:

http://regexr.com?35522

$yourNewString = preg_replace("/{(p[0-9]*)}/g", "$1", $yourString);

对于您的“终极”解决方案,我认为您需要超过 1 个正则表达式来运行字符串。正则表达式是关于获得某种模式并用它替换某些东西。现在您正在寻找专门将几个不同的字符串转换为其他字符串。

我认为你可能会更好地使用一个好的 ol' str_replace()or 并爆炸并一一检查它们。

于 2013-06-06T19:05:51.783 回答
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

于 2013-06-06T20:44:25.547 回答
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"
于 2013-06-06T19:33:44.883 回答