1

我有一个正则表达式,用于查看文件的文件扩展名是否不是给定的扩展名之一。有没有办法我可以写这个而不必把 . 在每个分机前?

^.*(?<!\.php|\.html|\.xml|\.js|\.css|\.bmp|\.ico|\.jpg|\.jpeg|\.png|\.gif|\.rss)$
4

2 回答 2

2

是的,您可以使用:

^.*(?<!\.(?:php|html|xml|js|css|bmp|ico|jpe?g|png|gif|.rss)$)$

将点移到组外,因为它对所有扩展都是通用的,并且jpg|jpeg可以写为jpe?g

于 2013-10-11T09:36:57.743 回答
2

是的,您可以使用非捕获组:

^.*(?<!\.(?:php|html|xml|js|css|bmp|ico|jpg|jpeg|png|gif|rss)$)$

虽然使用一些字符类也很好,但可能是这样的:

^.*(?<!\.(?:(?:ht|x)ml|j(?:pg|s|peg)|p(?:hp|ng)|[rc]ss|bmp|ico|gif)$)$

这减少了处理时间。虽然这些并不完全有效,因为在 PHP 中,lookbehinds 必须是固定宽度,因此,我建议使用负前瞻,如下所示:

^(?!.*\.(?:(?:ht|x)ml|j(?:peg|s|pg)|p(?:hp|ng)|[rc]ss|bmp|ico|gif)$).*$

初始正则表达式需要120 步来匹配,但在最后一个正则表达式中应用的更改只需35 步。

但是,如果要匹配扩展名.phpx,可以使用:

^(?!.*\.(?:(?:ht|x)ml|j(?:peg|s|pg)|p(?:hp|ng)|[rc]ss|bmp|ico|gif)).*$
于 2013-10-11T09:37:48.897 回答