我有一个正则表达式,用于查看文件的文件扩展名是否不是给定的扩展名之一。有没有办法我可以写这个而不必把 . 在每个分机前?
^.*(?<!\.php|\.html|\.xml|\.js|\.css|\.bmp|\.ico|\.jpg|\.jpeg|\.png|\.gif|\.rss)$
我有一个正则表达式,用于查看文件的文件扩展名是否不是给定的扩展名之一。有没有办法我可以写这个而不必把 . 在每个分机前?
^.*(?<!\.php|\.html|\.xml|\.js|\.css|\.bmp|\.ico|\.jpg|\.jpeg|\.png|\.gif|\.rss)$
是的,您可以使用:
^.*(?<!\.(?:php|html|xml|js|css|bmp|ico|jpe?g|png|gif|.rss)$)$
将点移到组外,因为它对所有扩展都是通用的,并且jpg|jpeg
可以写为jpe?g
是的,您可以使用非捕获组:
^.*(?<!\.(?: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)).*$