Preg替换回调

时间:2015-09-18 11:28:36

标签: php preg-replace preg-replace-callback

我正在尝试找出如何将一个可选组弹出到preg_replace_callback但我在匹配+字符时遇到问题

这是我到目前为止的代码

$pattern=preg_replace_callback('~:(?P<_param>[Aa-zZ0-9_\-]+)(?:(P<_mod>[^/]))?~',

    function($matches)
    {
        print_r($matches);
        $key=$matches[1];
        return '(?<'.$matches['_param'].'>'.$matches['_mod'].')';
    }
    ,$subject);

这会生成以下模式

/category/(?<foo>)/(?<baz>.)+/(?<bar>.)+/(?<harry>.)+/foo

对于以下字符串

/category/:foo/:baz.+/:bar.+/:harry.+/foo

正如你所看到的那样。但不是加号,基本上我希望它携带(进入命名的_mod捕获组)任何我附加到:变量的修饰符。

我不是很擅长正则表达式,所以我很惊讶能够做到这一点,对我的任务有任何帮助都会非常感激

1 个答案:

答案 0 :(得分:0)

在小组_mod之后添加量词:

$pattern=preg_replace_callback('~:(?P<_param>[Aa-zZ0-9_\-]+)(?:(?P<_mod>[^/]+))?~',function($matches){
//                                                                  here ___^

问题:您认为[Aa-zZ]匹配什么?

我想你想要[A-Za-z0-9_\-]+[\w-]

此外,preg_replace就足够了:

$pattern = preg_replace('~:([\w-]+)(?:([^/]*))?~', "(?<$1>$2)", $subject);