0

有没有办法重写这个正则表达式,使其不包括“/js”的前瞻?

就性能而言,这甚至是我应该担心的事情吗?它被用于过滤 HTTP 请求。

\.(asmx(?!/js)|aspx|htm)

编辑: 要明确:我想特别阻止“.asmx/js”,但允许所有其他 .asmx 请求通过。

BAD: Portal.asmx/js
GOOD: Portal.asmx/UpdateProduct
4

2 回答 2

3

如果您想阻止Portal.asmx/js但允许Portal.asmx/UpdateProduct有两种方法来处理它 - 列出所有接受值的白名单模式,或者对不需要的匹配项进行否定前瞻。

负前瞻几乎肯定会比列出所有可接受的值更好。

但是,简单地使用现有的表达式不会完全匹配您想要的。例如,它会阻止Portal.asmx/json并允许Portal.asmx/js.aspx- 这可能不是 URL,而只是突出显示需要修复的内容。

这个表达(从eyelidlessness answer复制)将适当地处理事情:

\.(asmx(?!/js[/\z])|aspx$|html?$)


值得解释的是,[/\z]字符类将匹配/<end of string>-\z与 to 相同,$但适用于字符类(其中$将匹配文字 $ 字符)。
(两者之间存在差异$\z但仅在多行模式下,这与 URL 过滤无关)。


一般来说,除非你有一个可衡量的性能问题,否则不要担心性能(否则你怎么知道你所做的改变是否有任何影响)。

于 2009-09-28T17:41:56.983 回答
2

不要担心这种简单的前瞻的性能。你的正则表达式很好。

编辑:但它可能会发现误报(例如 Portal.asmx/jssomething),您可以尝试以下操作:

\.(asmx(?!/js[/\z])|aspx$|html?$)
于 2009-09-28T18:50:08.983 回答