preg_match: /用户名或 /username/foo

preg_match: /usersname or /username/foo

我想要 preg_match 以下 URI。注意用户名是:[\w]{1,15}

/username
/username/foo
/usersname/bar

我希望这些都失败

/username/anythingelse

用户名是强制性的,因此如果只提供用户名,preg_match 应该可以工作,然后检查后面的内容是否是 foobar

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

你大概可以看出我的 preg_match 失败了。我该如何解决这个问题?

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

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

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

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

后跟 \/foo\/bar

^$ 指定字符串的开始和结束,这意味着正则表达式必须匹配整个字符串,而不仅仅是它的一部分

您可以阅读更多关于:

你什么都用大括号!

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

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

eval.in demo

我已将您的 ([\w]+){1,15} 替换为 (\w{1,15}):您的模式也匹配超过 15 个字符的用户名,因为它搜索“one of more word chars”重复 1 到 15 次,但是 ' one of more' 也匹配 16 个字符的单词!大括号前的斜线不匹配 'username' 但也不匹配 'username/foo' (它最终匹配 'username//foo')。