【问题标题】:Get extension from filename like variable - Javascript - jQuery [duplicate]从文件名中获取扩展名,如变量 - Javascript - jQuery [重复]
【发布时间】:2011-09-14 13:26:17
【问题描述】:

我有一个变量var file = "testfile.txt"; 我正在使用以下脚本来查找它的扩展名,它运行良好;

var parts = file.split('.');
var flename = parts[0];
var ext = parts[1];

但如果我有一个包含多个点的文件名,那么逻辑很糟糕。它会为filename.txt 提供txt,但在file.nam.e.txt 或其他情况下则不会。

有人建议我使用 javascript 和(或)jQuery 最简单的解决方案吗??

提前谢谢..

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    就这么简单:

    var ext = parts[parts.length - 1];
    

    关于文件名:

    var flename = parts.slice(0, parts.length - 1).join(".");
    

    最后但同样重要的是,我还将在该代码块之前验证 file 不为空以避免异常。

    编辑:另一种更优雅的类似方式:

    var ext = parts.splice(-1).join();
    var flename = parts.join(".");
    

    请注意,与第一种方法不同,这实际上会更改数组parts,因此以后不要使用它。

    【讨论】:

    • 那么没有扩展名的文件名呢..我的意思是filename for filename.txt...你能告诉我如何得到它吗.. :)
    • @blaster 欢呼看到我的新编辑,以避免出错的机会。这是我现在的最终答案.. :)
    • @Shadow,为什么不var ext = parts.splice(-1).join();var filename = parts.join(".");
    • @Marcus 因为我对splice 还不够熟悉,实际上是最近才开始使用slice。感谢您的建议,将对其进行快速测试并添加到答案中。 :)
    • @Shadow,哈哈! splice 可能更酷,但pop 更正确;)
    【解决方案2】:
    var parts = file.split('.')
      , ext = (parts.length > 1 ? parts.pop() : null)
      , filename = parts.join('.');
    

    【讨论】:

      【解决方案3】:

      如果file 始终包含至少一个点,您可以使用:

      var ext = file.slice(file.lastIndexOf(".")+1);
      var filename = file.slice(0,file.lastIndexOf("."));
      

      在更一般的情况下,file 可能不包含点:

      var ext = file.indexOf(".")<0?"":file.slice(file.lastIndexOf(".")+1);
      var filename = file.indexOf(".")<0?file:file.slice(0,file.lastIndexOf("."));
      
      最后,只是为了漂亮的代码:
      var lastDotIndex = file.lastIndexOf(".");
      
      if (lastDotIndex == -1) {    // Handles the case where there is no dot in "file"
      
          var fileExtension = "";
          var fileNameWithoutExtension = file;
      
      } else {    // Common case 
      
          var fileExtension = file.slice(lastDotIndex+1);
          var fileNameWithoutExtension = file.slice(0,lastDotIndex);
      
      }
      

      【讨论】:

        【解决方案4】:
        var ext = 'hibernate.cfg.xml';
        
        var index = ext.lastIndexOf('.');// .xml
        
        alert(ext.substring(index+1)); // xml
        

        【讨论】:

          【解决方案5】:

          为了获得一些替代方案,您也可以使用正则表达式提取它:

          var full = "filename.ext.txt";
          
          // Get all characters before the last dot
          var filename = /.*(?=\.)/.exec(full);
          
          // Get the part without dots on the end
          var extension = /[^\.]*$/.exec(full);
          
          // If there are no dots in the full name, filename will be empty and extension
          // will contain the whole filename. Do some extra processing:
          if(!filename){
              filename = full;
              extension = '';
          }
          

          【讨论】:

            【解决方案6】:

            您已经获得了许多可行的解决方案,但我想我会贡献一个面向对象的解决方案,该解决方案可能对更高级的场景有用:

            var File = function(fname){
                if (typeof fname === "undefined") {
                    console.log("You need to pass a filename or path to file");
                    return false;
                }
                // Correct slashes
                fname = fname.replace("\\", "/", fname);
                this.org = fname;
                if (fname.lastIndexOf("/")) {
                    this.path = fname.substr(0,fname.lastIndexOf("/")+1);
                    fname = fname.substr(fname.lastIndexOf("/")+1);
                }
                this.ext = fname.substr(fname.lastIndexOf(".")+1);
                this.name = fname.substr(0, fname.lastIndexOf("."));
            }
            

            然后您可以执行以下操作:

            var file = new File("/full/path/to/file/foo.bar.baz");
            

            现在,使用file.namefile.extfile.path 访问属性。

            【讨论】:

              猜你喜欢
              • 2011-09-13
              • 1970-01-01
              • 2012-03-24
              • 1970-01-01
              • 1970-01-01
              • 2015-02-14
              • 1970-01-01
              • 2011-05-09
              • 2012-09-12
              相关资源
              最近更新 更多