匹配所有字母/数字组合但具体的单词?

时间:2012-03-08 22:00:34

标签: regex mod-rewrite

我已经看过并发现有关负面的事情,但我仍然不确定应该为此做些什么。我有一个RewriteRule ^([a-zA-Z0-9]+)/?$,它可以正常工作,但现在我希望它特别排除“帮助”这个词(只有“帮助”,而不是“帮助”,“小伙子”等),可能还有少量其他的词在将来。对不起,我知道这有很多类似的问题,但我无法弄清楚如何将它们特别应用于此。

2 个答案:

答案 0 :(得分:1)

Apache mod-rewrite应该有一个明确定义的顺序,它通过RewriteRules解析它以及如果存在冲突它会遵循哪个规则。

假设它将遵循第一个匹配规则,只需在常规规则之前定义特定规则。

答案 1 :(得分:0)

另外,不管你信不信,你可以编写一个匹配所有字母数字字符串的正则表达式,除了“帮助”。正则表达式([a-zA-Z0-9]+)/?&~help可以重写为不使用&~(和非)运算符(不广泛使用)的正则表达式。

正则表达式看起来像狗的早餐,所以你真的不想这样做。但这是如何。

首先,匹配所有较短的字母数字代码。 “hel”是可接受的问题,也不是任何其他三个字母/数字序列:

[a-zA-Z0-9]{1,3}

我们还可以识别五个或更多字符的序列;他们也不是“帮助”,包括:

[a-zA-Z0-9]{5,}

现在是棘手的部分,匹配四个字母的序列,这是没有帮助的。这意味着任何四个不以h开头的char标识符,或任何四个没有e作为第二个字母的char。等:

[a-gi-zA-Z0-9][a-zA-Z0-9]{3}
[a-zA-Z0-9][a-df-zA-Z0-9][a-zA-Z0-9]{2}
[a-zA-Z0-9]{2}[a-km-zA-Z0-9][a-zA-Z0-9]
[a-zA-Z0-9]{3}[a-oq-zA-Z0-9]

唯一与其中任何一个都不匹配的四个字符模式是“帮助”。它与第一个不匹配,因为h,第二个是因为e等。

所以,将它们与|组合在一起和锚定。深吸一口气:

^([a-zA-Z0-9]{1,3}|[a-zA-Z0-9]{5,}|[a-gi-zA-Z0-9][a-zA-Z0-9]{3}|[a-zA-Z0-9][a-df-zA-Z0-9][a-zA-Z0-9]{2}|[a-zA-Z0-9]{2}[a-km-zA-Z0-9][a-zA-Z0-9]|[a-zA-Z0-9]{3}[a-oq-zA-Z0-9])$

这应该是EFNet IRC网络上#unix的新频道密钥。 :)

我要测试一下吗?你有什么事情......

当然我做了,但是用sed。一点点。大多数元字符必须被转义,oops:

$ sed -n -e '/^\([a-zA-Z0-9]\{1,3\}\|[a-zA-Z0-9]\{5,\}\|[a-gi-zA-Z0-9][a-zA-Z0-9]\{3\}\|[a-zA-Z0-9][a-df-zA-Z0-9][a-zA-Z0-9]\{2\}\|[a-zA-Z0-9]\{2\}[a-km-zA-Z0-9][a-zA-Z0-9]\|[a-zA-Z0-9]\{3\}[a-oq-zA-Z0-9]\)$/p'
a  <- typed
a
aa  <- typed
aa
aaa  <-
aaa
aaaa   <-
aaaa
aaaaa  <-
aaaaa
help   <-  aha, no response from sed
aelp   <-
aelp
helper <-
helper