Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript globbing-匹配某些文件扩展名但不匹配其他文件扩展名的正确方法_Javascript_Node.js_Gruntjs_Glob_Node Glob - Fatal编程技术网

Javascript globbing-匹配某些文件扩展名但不匹配其他文件扩展名的正确方法

Javascript globbing-匹配某些文件扩展名但不匹配其他文件扩展名的正确方法,javascript,node.js,gruntjs,glob,node-glob,Javascript,Node.js,Gruntjs,Glob,Node Glob,我在grunt-aws-s3任务中编写了下面的代码片段 var weekCache = 'css|js'; var yearCache = 'jpg|jpeg|png|gif|ico|eot|otf|ttf|woff|woff2'; var prodFiles = [ {expand: true, cwd: 'public', src: ['**/*.!('+weekCache+'|'+yearCache+')'], dest: '/'}, {expand: true, cwd:

我在
grunt-aws-s3
任务中编写了下面的代码片段

var weekCache = 'css|js';
var yearCache = 'jpg|jpeg|png|gif|ico|eot|otf|ttf|woff|woff2';
var prodFiles = [
    {expand: true, cwd: 'public', src: ['**/*.!('+weekCache+'|'+yearCache+')'], dest: '/'},
    {expand: true, cwd: 'public', src: ['**/*.@('+weekCache+')'], dest: '/', stream: true, params: {CacheControl: 'max-age=604800, public'}}, // enable stream to allow large files
    {expand: true, cwd: 'public', src: ['**/*.@('+yearCache+')'], dest: '/', stream: true, params: {CacheControl: 'max-age=31536000, public'}},
];
想法是在
prodFiles
变量中有三种不同的匹配:

  • 匹配除由
    yearCache
    weekCache
  • 将所有文件与
    weekCache中携带的扩展名匹配
  • 将所有文件与
    yearCache中携带的扩展名匹配
  • 它或多或少可以工作,我在
    public
    目录及其子目录中有63个文件。然而,这些规则匹配72个文件,很明显,一些文件至少匹配了两次

    我的地球仪怎么了

    编辑:

    使用
    节点glob all
    进行测试表明,错误出现在第一个模式中:

    $ glob-all '**/*.!(css|js)'
    assets/css/style-nuvue6sithwirecbhvw3dkaobiojqvtadsnhguwi7k04xklybw5djl1smadp.min.css
    assets/images/favicon.ico
    assets/js/jquery.fancybox.js
    assets/js/jquery.fancybox-thumbs.js
    
    我希望该模式返回所有内容,但不包括
    *.js
    *.css
    。根据其他两个规则进行测试返回正确的文件

    $ glob-all '**/*.@(css|js)'
    assets/css/style-nuvue6sithwirecbhvw3dkaobiojqvtadsnhguwi7k04xklybw5djl1smadp.min.css
    assets/js/jquery.fancybox.js
    assets/js/jquery.fancybox-thumbs.js
    

    因此,问题是如何正确地否定模式
    '***。!(css|js)

    我认为您的问题在于文件名包含多个点()

    您的模式指定查找具有一定数量的非点字符、后跟点字符、后跟除“css”或“js”以外的任何字符的所有文件名

    以文件名“jquery.fancybox.js”为例。对于这个文件名,我们发现有一些非点字符“jquery”,后跟一个点“.”,后跟不是“css”和“js”、“fancybox.js”的字符。此文件名与模式匹配,因此返回

    如果上面的文件名是“fancybox.js”,它将匹配一些非点字符“fancybox”,后跟一个点“.”,但后跟的字符不是“css”和“js”。因此,该文件名将无法与模式匹配,并且不会返回

    我们要做的是在否定模式中指定在扩展名“.css”或“.js”之前可能有更多的非点字符。我们可以使用以下模式进行此操作:

    '**/*.!(*(*.)js|*(*.)css)'
    

    我相信您的问题是您的文件名包含多个点(.)

    您的模式指定查找具有一定数量的非点字符、后跟点字符、后跟除“css”或“js”以外的任何字符的所有文件名

    以文件名“jquery.fancybox.js”为例。对于这个文件名,我们发现有一些非点字符“jquery”,后跟一个点“.”,后跟不是“css”和“js”、“fancybox.js”的字符。此文件名与模式匹配,因此返回

    如果上面的文件名是“fancybox.js”,它将匹配一些非点字符“fancybox”,后跟一个点“.”,但后跟的字符不是“css”和“js”。因此,该文件名将无法与模式匹配,并且不会返回

    我们要做的是在否定模式中指定在扩展名“.css”或“.js”之前可能有更多的非点字符。我们可以使用以下模式进行此操作:

    '**/*.!(*(*.)js|*(*.)css)'
    

    很好的解释。谢谢。我想,你提议的globbing不能捕获没有点的文件,对吗?很好的解释。谢谢。我想,你提议的globbing不能捕获没有点的文件,对吗?