我怎样才能获得JavaScript的文件扩展名?

见代码:

var file1 = "50.xsl"; var file2 = "30.doc"; getFileExtension(file1); //returs xsl getFileExtension(file2); //returs doc function getFileExtension(filename) { /*TODO*/ } 

较新的编辑:自从这个问题最初发布以来,很多事情都发生了变化 – 在wallacer的修改后的答案以及VisioN的出色的故障中,有很多非常好的信息


编辑:只是因为这是被接受的答案; wallacer的答案确实好多了:

 return filename.split('.').pop(); 

我的老回答:

 return /[^.]+$/.exec(filename); 

应该这样做。

编辑:为了回应PhiLho的评论,使用类似于:

 return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined; 
 return filename.split('.').pop(); 

把事情简单化 :)

编辑:

这是另一个我认为更有效的非正则expression式解决scheme:

 return filename.substring(filename.lastIndexOf('.')+1, filename.length) || filename; 

有一些angular落案例更好地处理下面的VisioN的答案 ,特别是没有扩展名(包括.htaccess等)的文件。

这是非常高效的,并且在点之前没有点或没有string的情况下,通过返回""而不是完整的string来处理转angular情况。 这是一个非常好的解决scheme,尽pipe难以阅读。 把它放在你的助手lib中,然后使用它。

旧编辑:

如果您要运行不带扩展名的文件,或者没有扩展名的隐藏文件(参见上面的Tom的回答,请参阅VisioN的评论),则可以采用更安全的实现方式

 var a = filename.split("."); if( a.length === 1 || ( a[0] === "" && a.length === 2 ) ) { return ""; } return a.pop(); // feel free to tack .toLowerCase() here if you want 

如果a.length是1,那么它是一个没有扩展名的可见文件。 文件

如果a[0] === ""a.length === 2这是一个没有扩展名的隐藏文件ie。 的.htaccess

希望这有助于解决稍微复杂的案例。 在性能方面,我相信这个解决scheme比大多数浏览器中的正则expression式要慢一些 。 但是,对于大多数常见目的,这个代码应该是完全可用的。

以下解决scheme快速且足够 ,可用于批量操作并节省额外的字节:

  return fname.slice((fname.lastIndexOf(".") - 1 >>> 0) + 2); 

这是另一种单行非正则expression式通用解决scheme:

  return fname.slice((Math.max(0, fname.lastIndexOf(".")) || Infinity) + 1); 

这两个工作正确与没有扩展名(例如myfile )或开始. 点(例如.htaccess ):

  "" --> "" "name" --> "" "name.txt" --> "txt" ".htpasswd" --> "" "name.with.many.dots.myext" --> "myext" 

如果你关心速度,你可以运行基准testing,并检查提供的解决scheme是最快的,而短的速度是非常快的:

速度比较

如何短的工作:

  1. String.lastIndexOf方法返回给定string(即fnamefnamestring的最后位置(即"." )。 如果找不到子string,则返回-1
  2. 点号在文件名中的“不可接受”位置分别是-10 ,分别表示没有扩展名的名称(例如"name" )和以点开头的名称(例如".htaccess" )。
  3. 零填充右移运算符 ( >>> )如果与零一起使用会影响负数转换-14294967295-24294967294 ,这有助于在边缘情况下保持文件名不变(这里有一个技巧)。
  4. String.prototype.slice从所描述的位置提取文件名的一部分。 如果位置号大于string方法的长度则返回""

如果您想要更清晰的解决scheme(以完全path的额外支持)以相同的方式工作,请检查以下扩展版本。 这个解决scheme比以前的单行程更慢,但更容易理解。

 function getExtension(path) { var basename = path.split(/[\\/]/).pop(), // extract file name from full path ... // (supports `\\` and `/` separators) pos = basename.lastIndexOf("."); // get last position of `.` if (basename === "" || pos < 1) // if file name is empty or ... return ""; // `.` not found (-1) or comes first (0) return basename.slice(pos + 1); // extract extension ignoring `.` } console.log( getExtension("/path/to/file.ext") ); // >> "ext" 

所有这三种变体都可以在客户端的任何Web浏览器中工作,也可以在服务器端的NodeJS代码中使用。

 function getFileExtension(filename) { var ext = /^.+\.([^.]+)$/.exec(filename); return ext == null ? "" : ext[1]; } 

经过testing

 "ab" (=> "b") "a" (=> "") ".hidden" (=> "") "" (=> "") null (=> "") 

 "abcd" (=> "d") ".ab" (=> "b") "a..b" (=> "b") 
 function getExt(filename) { var ext = filename.split('.').pop(); if(ext == filename) return ""; return ext; } 
 var extension = fileName.substring(fileName.lastIndexOf('.')+1); 
 var parts = filename.split('.'); return parts[parts.length-1]; 
 function file_get_ext(filename) { return typeof filename != "undefined" ? filename.substring(filename.lastIndexOf(".")+1, filename.length).toLowerCase() : false; } 

快速和正确的path

 (filename.match(/[^\\\/]\.([^.\\\/]+)$/) || [null]).pop() 

一些边缘情况

 /path/.htaccess => null /dir.with.dot/file => null 

使用split的解决scheme很慢,而使用lastIndexOf的解决scheme不能处理边界情况。

 /** * Extract file extension from URL. * @param {String} url * @returns {String} File extension or empty string if no extension is present. */ var getFileExtension = function (url) { "use strict"; if (url === null) { return ""; } var index = url.lastIndexOf("/"); if (index !== -1) { url = url.substring(index + 1); // Keep path without its segments } index = url.indexOf("?"); if (index !== -1) { url = url.substring(0, index); // Remove query } index = url.indexOf("#"); if (index !== -1) { url = url.substring(0, index); // Remove fragment } index = url.lastIndexOf("."); return index !== -1 ? url.substring(index + 1) // Only keep file extension : ""; // No extension found }; 

testing

请注意,在没有查询的情况下,片段可能仍然存在。

 "https://www.example.com:8080/segment1/segment2/page.html?foo=bar#fragment" --> "html" "https://www.example.com:8080/segment1/segment2/page.html#fragment" --> "html" "https://www.example.com:8080/segment1/segment2/.htaccess?foo=bar#fragment" --> "htaccess" "https://www.example.com:8080/segment1/segment2/page?foo=bar#fragment" --> "" "https://www.example.com:8080/segment1/segment2/?foo=bar#fragment" --> "" "" --> "" null --> "" "abcd" --> "d" ".ab" --> "b" ".ab" --> "" "a...b" --> "b" "..." --> "" 

JSLint的

0警告。

尝试这个:

 function getFileExtension(filename) { var fileinput = document.getElementById(filename); if (!fileinput) return ""; var filename = fileinput.value; if (filename.length == 0) return ""; var dot = filename.lastIndexOf("."); if (dot == -1) return ""; var extension = filename.substr(dot, filename.length); return extension; } 

我只是想分享这一点。

 fileName.slice(fileName.lastIndexOf('.')) 

虽然这有一个垮台,没有扩展名的文件将返回最后一个string。 但如果你这样做,这将解决一切:

  function getExtention(fileName){ var i = fileName.lastIndexOf('.'); if(i === -1 ) return false; return fileName.slice(i) } 
 return filename.replace(/\.([a-zA-Z0-9]+)$/, "$1"); 

编辑:奇怪(或者可能不是)在replace方法的第二个参数$1似乎不工作…对不起。

我刚刚意识到仅仅对p4bl0的回答发表评论是不够的,尽pipe汤姆的回答显然解决了这个问题:

 return filename.replace(/^.*?\.([a-zA-Z0-9]+)$/, "$1"); 

对于大多数应用程序,一个简单的脚本如

 return /[^.]+$/.exec(filename); 

会工作得很好(由汤姆提供)。 然而这并不是一个很好的certificate。 如果提供以下文件名称,则不起作用:

 image.jpg?foo=bar 

这可能有点矫枉过正,但我​​会build议使用这样一个URLparsing器,以避免由于不可预知的文件名失败。

使用这个特定的函数,你可以得到像这样的文件名:

 var trueFileName = parse_url('image.jpg?foo=bar').file; 

这将输出“image.jpg”没有urlvariables。 然后你可以自由地抓取文件扩展名。

 function func() { var val = document.frm.filename.value; var arr = val.split("."); alert(arr[arr.length - 1]); var arr1 = val.split("\\"); alert(arr1[arr1.length - 2]); if (arr[1] == "gif" || arr[1] == "bmp" || arr[1] == "jpeg") { alert("this is an image file "); } else { alert("this is not an image file"); } } 
 function extension(fname) { var pos = fname.lastIndexOf("."); var strlen = fname.length; if (pos != -1 && strlen != pos + 1) { var ext = fname.split("."); var len = ext.length; var extension = ext[len - 1].toLowerCase(); } else { extension = "No extension found"; } return extension; } 

//用法

分机( 'file.jpeg')

总是返回扩展名较低的CAS,所以你可以检查它在现场更改作品:

file.JpEg

文件(没有扩展名)

文件。 (noextension)

我晚了很多月亮,但为了简单,我使用这样的东西

 var fileName = "I.Am.FileName.docx"; var nameLen = fileName.length; var lastDotPos = fileName.lastIndexOf("."); var fileNameSub = false; if(lastDotPos === -1) { fileNameSub = false; } else { //Remove +1 if you want the "." left too fileNameSub = fileName.substr(lastDotPos + 1, nameLen); } document.getElementById("showInMe").innerHTML = fileNameSub; 
 <div id="showInMe"></div> 

一个解决scheme,也将帐户查询参数和URL中的任何字符。

 string.match(/(.*)\??/i).shift().replace(/\?.*/, '').split('.').pop() // Example // some.url.com/with.in/&ot.s/files/file.jpg?spec=1&.ext=jpg // jpg 

如果你正在寻找一个特定的扩展名,并知道它的长度,你可以使用substr

 var file1 = "50.xsl"; if (file1.substr(-4) == '.xsl') { // do something } 

JavaScript参考: https //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr

在node.js中,这可以通过以下代码来实现:

 var file1 ="50.xsl"; var path = require('path'); console.log(path.parse(file1).name); 

Wallacer的回答很好,但还需要再检查一次。

如果文件没有扩展名,它将使用文件名作为不好的扩展名。

试试这个:

 return ( filename.indexOf('.') > 0 ) ? filename.split('.').pop().toLowerCase() : 'undefined'; 

不要忘了一些文件可以没有扩展名,所以:

 var parts = filename.split('.'); return (parts.length > 1) ? parts.pop() : ''; 
 var filetypeArray = (file.type).split("/"); var filetype = filetypeArray[1]; 

这是一个更好的方法。

 var file = "hello.txt"; var ext = (function(file, lio) { return lio === -1 ? undefined : file.substring(lio+1); })(file, file.lastIndexOf(".")); // hello.txt -> txt // hello.dolly.txt -> txt // hello -> undefined // .hello -> hello 

这个简单的scheme

 function extension(filename) { var r = /.+\.(.+)$/.exec(filename); return r ? r[1] : null; } 

testing

 /* tests */ test('cat.gif', 'gif'); test('main.c', 'c'); test('file.with.multiple.dots.zip', 'zip'); test('.htaccess', null); test('noextension.', null); test('noextension', null); test('', null); // test utility function function test(input, expect) { var result = extension(input); if (result === expect) console.log(result, input); else console.error(result, input); } function extension(filename) { var r = /.+\.(.+)$/.exec(filename); return r ? r[1] : null; }