I'm wanting to preg_match the following URIs. Note usernames are: [\w]{1,15}
/username
/username/foo
/usersname/bar
I want these to fail
/username/anythingelse
The username is mandatory, so the preg_match should work if just a username is given, and then check if anything after is either foo
or bar
.
preg_match('{^\/([\w]+){1,15}/{/foo|/bar}?$}', $uriString)
You can probably tell my preg_match fails. How may I fix this?
Use parentheses to specify a group of alternatives;
Curly braces are only used to limit repetition {min,max}
^\/\w{1,15}(\/foo|\/bar)?$
==> DEMO
Above, we allow \w
1 up to 15 times (\w
matches any word character [a-zA-Z0-9_])
Followed by either \/foo
or \/bar
^
and $
specify the start and the end of the string, meaning that the regex must match the full string not only a part of it
You can read more about:
You use curly brackets for everything!
You can't use curly brackets to group, you have to use standard brackets; try this:
'{^\/(\w{1,15})(/foo|/bar)?$}'
I have replaced your ([\w]+){1,15}
with (\w{1,15})
: your pattern match also usernames with more than 15 characters, because it search ‘one of more word chars’ repeating 1 to 15 times, but ‘one of more’ match also 16 characters words! Your slash before curly brackets doesn't match 'username' but also 'username/foo' (it match eventually 'username//foo').