我正在尝试匹配:
http://example.com/foo
http://example.com/foo/
http://example.com/foo/bar
http://example.com/foo/bar/addditional
但不是
http://example.com/foofake
任何人都知道如何做到这一点,或者有人有任何正则表达式吗?
答案 0 :(得分:0)
我已经看到这个问题被问了很多时间,以及SO和其他地方,我只是想出了这个好的技巧,并希望分享它。
这个RewriteRule
正则表达式可行:
RewriteRule ^foo/{0,1}(?![a-z])(.*)
进一步说明:
foo
匹配与foo相关的东西。
/{0,1}
表示必须有零个或一个尾部斜杠。你可能认为这只会匹配/ foo或/ foo /,但这也匹配/ foofake因为它在foo之后也有任何尾随斜杠。
(?![a-z])
这是这个正则表达式的主要部分。这表示方括号内的东西,即[a-z]不应该在foo之后存在。请注意,这仍将匹配其他字符,如/ foo + bar。请继续阅读更复杂的版本。
(.*)
在尾部斜杠后匹配任何。这也可以根据需要进行优化。
这是一个使用相同逻辑的更复杂的版本:
foo/{0,1}(?![a-zA-Z0-9`~!@$%^&*()_\-\{\}\[\]\+\=\\\|:;"'>.<,'\s])(.*)$
这个将键盘上的所有字符列入黑名单,这样它们就不会出现在/ foo之后。
您可以在此处查看迷你版本:http://regexr.com?33blp
您可以在此处找到适用的扩展版本:http://regexr.com?33bme
我觉得这种方法有很大的改进空间,所以如果你发现任何缺陷或者找到一种方法让它变得很棒,请发表评论!