【问题标题】:PHP preg_replace_callback ignore idPHP preg_replace_callback 忽略 id
【发布时间】:2015-09-16 10:53:21
【问题描述】:

我正在使用以下代码匹配除 id 之外的所有字母。

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

我怎样才能改变它,以便 id 可以存在,但不是按那个顺序(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);

【问题讨论】:

    标签: php regex


    【解决方案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] 将持有“类型”,因此您将正确地从数组中获取值。

    【讨论】:

      【解决方案2】:

      使用否定的前瞻断言。

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

      DEMO

      示例:

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

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

      DEMO

      【讨论】:

      • 当我在上面的函数中使用该正则表达式时,我得到:preg_replace_callback(): Delimiter must not be alphanumeric or backslash
      • 请使用~ 作为正则表达式分隔符。
      • 谢谢,但现在我收到了Undefined offset: 1
      • 我已在原帖底部发布了我的完整代码。
      猜你喜欢
      • 2014-12-23
      • 2011-10-19
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多