预替换回调

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 捕获组)我附加到 :variable.

的任何修饰符

我不太擅长正则表达式,所以我很惊讶能走到这一步,非常感谢对我的追求的任何帮助

组后加量词_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-]+)(?:([^/]*))?~', "(?<>)", $subject);