0

我正在尝试匹配:

http://example.com/foo

http://example.com/foo/

http://example.com/foo/bar

http://example.com/foo/bar/addditional

但不是

http://example.com/foofake

任何人都知道如何做到这一点,或者有人对此有任何正则表达式吗?

4

1 回答 1

0

我已经看到这个问题被问了很多次,所以和其他地方,我只是想出了这个好把戏,并想分享它。

这个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

我觉得这个方法有很大的改进空间,所以如果你发现任何缺陷或者你找到了让它更棒的方法,请评论!

于 2013-01-09T17:28:52.307 回答