I am trying to work out how to pop an optional group into a preg_replace_callback but I am having trouble matching the + character
Here is the code I have this far
$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);
This generates the following pattern
/category/(?<foo>)/(?<baz>.)+/(?<bar>.)+/(?<harry>.)+/foo
For the following string
/category/:foo/:baz.+/:bar.+/:harry.+/foo
As you can see it's carrying over the . but not the plus, essentially I would like it to carry (into the named _mod capture group) any modifier that I append to a :variable.
I am not very good at regex so I'm amazed to have gotten this far and any help on my quest would be greatly appreciated
Add a quantifier after the group _mod
:
$pattern=preg_replace_callback('~:(?P<_param>[Aa-zZ0-9_\-]+)(?:(?P<_mod>[^/]+))?~',function($matches){
// here ___^
question: what do you think [Aa-zZ]
matches?
I guess you want [A-Za-z0-9_\-]+
or [\w-]
Furthermore, preg_replace
would suffice here:
$pattern = preg_replace('~:([\w-]+)(?:([^/]*))?~', "(?<$1>$2)", $subject);