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