PHP preg_replace_callback忽略id

时间:2015-09-16 10:53:21

标签: php regex

我使用以下代码匹配除 i d 之外的所有字母。

/{([abcefghj-z]+)}/

如何更改它以便 i d 可以存在但不能按顺序存在(id)。

示例字符串:

/admin/users/{type}/{id}/edit

在上面的例子中只会替换{type}。

示例2:

/admin/users/{type}/{id}/{supplied}/edit

在上面的示例中,{type}和{supplied}都会匹配。

这是否可以使用正则表达式?

更新

我正在使用的代码如下:

$current = 'admin/users/{type}/{id}/changePassword';
$parameters = array('type' => 'administrators', 'id' => '1');

$path = preg_replace_callback('~\{(?!id\})[a-z]+\}~', function ($m) use ($parameters) {
        return $parameters[$m[1]]; 
}, $current);

2 个答案:

答案 0 :(得分:1)

这是一个适合您的解决方案:您需要使用capturing group(因此我在([a-z]+)中添加了圆括号)才能获得您需要的值,我发现您需要执行以不区分大小写的方式搜索(因此,我添加了~i):

$current = 'admin/users/{type}/{id}/changePassword';
$parameters = array('type' => 'administrators', 'id' => '1');

$path = preg_replace_callback('~\{(?!id\})([a-z]+)\}~i', function ($m) use ($parameters) {
//                                        ^      ^   ^
        return $parameters[$m[1]]; 
}, $current);

echo $path;

请参阅IDEONE demo

使用捕获组,$m[1]将保持"键入",这样您就可以正确地从数组中获取值。

答案 1 :(得分:0)

使用否定先行断言。

\{(?!id\})[a-z]+\}
  • (?!id\})断言前一个令牌{后面会跟不上id}
  • 如果是,则匹配一个或多个小写字母,然后匹配}

DEMO

示例:

这会将所有匹配的子字符串替换为{foo}

preg_replace('~\{(?!id\})[a-z]+\}~', '{foo}', $str);

DEMO