我正在尝试找出如何将一个可选组弹出到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捕获组)任何我附加到:变量的修饰符。
我不是很擅长正则表达式,所以我很惊讶能够做到这一点,对我的任务有任何帮助都会非常感激
答案 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);