Php 预匹配:/usersname或/username/foo

Php 预匹配:/usersname或/username/foo,php,regex,preg-match,Php,Regex,Preg Match,我想预先匹配以下URI。注意用户名是:[\w]{1,15} /username /username/foo /usersname/bar 我希望这些失败 /username/anythingelse 用户名是必需的,因此如果只提供了用户名,则preg_匹配应该有效,然后检查后面的内容是否为foo或bar preg_match('{^\/([\w]+){1,15}/{/foo|/bar}?$}', $uriString) 你可能知道我的预赛失败了。如何解决此问题?使用括号指定一组备选方案 大

我想预先匹配以下URI。注意用户名是:[\w]{1,15}

/username
/username/foo
/usersname/bar
我希望这些失败

/username/anythingelse
用户名是必需的,因此如果只提供了用户名,则preg_匹配应该有效,然后检查后面的内容是否为
foo
bar

preg_match('{^\/([\w]+){1,15}/{/foo|/bar}?$}', $uriString)

你可能知道我的预赛失败了。如何解决此问题?

使用括号指定一组备选方案

大括号仅用于限制重复
{min,max}

^\/\w{1,15}(\/foo |\/bar)$
=>

上面,我们允许
\w
1最多15次(
\w
匹配任何单词字符[a-zA-Z0-9])

后跟
\/foo
\/bar

^
$
指定字符串的开头和结尾,这意味着正则表达式必须匹配完整字符串,而不仅仅是其中的一部分

您可以阅读更多关于:


你什么都用花括号

你不能用花括号来分组,你必须用标准括号;试试这个:

'{^\/(\w{1,15})(/foo|/bar)?$}'


我已将您的
([\w]+){1,15}
替换为
(\w{1,15})
:您的模式也将用户名匹配为15个以上字符,因为它搜索重复1到15次的“多个单词中的一个”,但“多个单词中的一个”也将匹配16个字符的单词!花括号前的斜杠与“username”和“username/foo”不匹配(最终与“username//foo”匹配)。

花括号太多了!