我想要preg_match以下URI。注意用户名是:[\ w] {1,15}
/username
/username/foo
/usersname/bar
我希望这些失败
/username/anythingelse
用户名是必填项,因此如果只提供用户名,则preg_match应该有效,然后检查以后是否有foo
或bar
。
preg_match('{^\/([\w]+){1,15}/{/foo|/bar}?$}', $uriString)
你可能会告诉我的preg_match失败。我该如何解决这个问题?
答案 0 :(得分:2)
使用括号指定一组备选方案;
大括号仅用于限制重复{min,max}
^\/\w{1,15}(\/foo|\/bar)?$
==> DEMO
以上,我们允许\w
1最多15次(\w
匹配任何单词字符[a-zA-Z0-9 _])
后跟\/foo
或\/bar
^
和$
指定字符串的开头和结尾,这意味着正则表达式必须匹配整个字符串而不仅仅是其中的一部分
您可以阅读更多关于:
的信息答案 1 :(得分:1)
你可以使用大括号!
您不能使用花括号进行分组,您必须使用标准括号;试试这个:
'{^\/(\w{1,15})(/foo|/bar)?$}'
的 eval.in demo 强>
我已将([\w]+){1,15}
替换为(\w{1,15})
:您的模式匹配也包含超过15个字符的用户名,因为它搜索“一个或多个单词字符”重复1到15次,但是更多'匹配16个字符的单词!大括号之前的斜杠与“用户名”不匹配'还有' username / foo' (它最终匹配'用户名// foo')。