看代码:
var file1 = "50.xsl"; var file2 = "30.doc"; getFileExtension(file1); //returns xsl getFileExtension(file2); //returns doc function getFileExtension(filename) { /*TODO*/ }
wallacer.. 784
return filename.split('.').pop();
把事情简单化 :)
编辑:
这是另一种非正则表达式解决方案,我认为它更有效:
return filename.substring(filename.lastIndexOf('.')+1, filename.length) || filename;
VisioN的答案可以更好地处理一些极端情况,特别是没有扩展名的文件(.htaccess
包括其他内容).
它非常高效,并且在""
点之前没有点或没有字符串时返回而不是完整的字符串,以可以说是更好的方式处理角落情况.这是一个非常精心设计的解决方案,虽然难以阅读.将它粘贴在你的助手lib中,然后使用它.
旧编辑:
如果您要运行没有扩展名的文件或没有扩展名的隐藏文件(请参阅VisioN对Tom上面的答案的评论),这将是一个更安全的实现
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
是一个,它是一个没有扩展名的可见文件,即.文件
如果a[0] === ""
和a.length === 2
它是一个隐藏的文件不带扩展名即.的.htaccess
希望这有助于解决稍微复杂的案例中的问题.在性能方面,我相信这个解决方案比大多数浏览器中的正则表达式慢一点.但是,出于最常见的目的,此代码应该是完全可用的.
return filename.split('.').pop();
把事情简单化 :)
编辑:
这是另一种非正则表达式解决方案,我认为它更有效:
return filename.substring(filename.lastIndexOf('.')+1, filename.length) || filename;
VisioN的答案可以更好地处理一些极端情况,特别是没有扩展名的文件(.htaccess
包括其他内容).
它非常高效,并且在""
点之前没有点或没有字符串时返回而不是完整的字符串,以可以说是更好的方式处理角落情况.这是一个非常精心设计的解决方案,虽然难以阅读.将它粘贴在你的助手lib中,然后使用它.
旧编辑:
如果您要运行没有扩展名的文件或没有扩展名的隐藏文件(请参阅VisioN对Tom上面的答案的评论),这将是一个更安全的实现
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
是一个,它是一个没有扩展名的可见文件,即.文件
如果a[0] === ""
和a.length === 2
它是一个隐藏的文件不带扩展名即.的.htaccess
希望这有助于解决稍微复杂的案例中的问题.在性能方面,我相信这个解决方案比大多数浏览器中的正则表达式慢一点.但是,出于最常见的目的,此代码应该是完全可用的.
更新的编辑:自从这个问题最初发布以来,很多事情都发生了变化 - 在wallacer的修订答案以及VisioN的优秀故障中有很多非常好的信息
编辑:只是因为这是接受的答案; wallacer的答案确实要好得多:
return filename.split('.').pop();
我的回答是:
return /[^.]+$/.exec(filename);
应该这样做.
编辑:回应PhiLho的评论,请使用以下内容:
return (/[.]/.exec(filename)) ? /[^.]+$/.exec(filename) : undefined;
以下解决方案快速且足够短,可用于批量操作并节省额外的字节:
return fname.slice((fname.lastIndexOf(".") - 1 >>> 0) + 2);
这是另一个单线非正则表达式通用解决方案:
return fname.slice((Math.max(0, fname.lastIndexOf(".")) || Infinity) + 1);
两者都可以正常使用没有扩展名的名称(例如myfile)或以.
dot开头(例如.htaccess):
"" --> "" "name" --> "" "name.txt" --> "txt" ".htpasswd" --> "" "name.with.many.dots.myext" --> "myext"
如果您关心速度,您可以运行基准测试并检查提供的解决方案是否最快,而短的速度非常快:
简短的如何运作:
String.lastIndexOf
method返回"."
给定字符串(即fname
)中子字符串(即)的最后位置.如果找不到子字符串,则返回方法-1
.
文件名中点的"不可接受"位置是-1
和0
,分别表示没有扩展名的名称(例如"name"
)和以点(例如".htaccess"
)开头的名称.
填零右移位运算符(>>>
如果与零使用)影响负数转变-1
到4294967295
和-2
到4294967294
,这是剩下的文件名在边缘案件不变(不大不小的伎俩在这里)是有用的.
String.prototype.slice
从如上所述计算的位置提取文件名的一部分.如果位置编号大于字符串方法返回的长度""
.
如果您想要更清晰的解决方案,它将以相同的方式工作(加上对完整路径的额外支持),请检查以下扩展版本.此解决方案将比以前的单行更慢,但更容易理解.
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]; }
经过测试
"a.b" (=> "b") "a" (=> "") ".hidden" (=> "") "" (=> "") null (=> "")
也
"a.b.c.d" (=> "d") ".a.b" (=> "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; }
码
/** * 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 };
测试
请注意,在没有查询的情况下,片段可能仍然存在.
"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 --> "" "a.b.c.d" --> "d" ".a.b" --> "b" ".a.b." --> "" "a...b" --> "b" "..." --> ""
JSLint的
0警告.
快速并且可以正确使用路径
(filename.match(/[^\\\/]\.([^.\\\/]+)$/) || [null]).pop()
一些边缘情况
/path/.htaccess => null /dir.with.dot/file => null
使用split的解决方案很慢,而使用lastIndexOf的解决方案不能处理边缘情况.
我只是想分享这个。
fileName.slice(fileName.lastIndexOf('.'))
尽管这样做有个缺点,但没有扩展名的文件将返回最后一个字符串。但是,如果这样做,则可以解决所有问题:
function getExtention(fileName){ var i = fileName.lastIndexOf('.'); if(i === -1 ) return false; return fileName.slice(i) }
// ???????
function getFileExtension(file) {
var regexp = /\.([0-9a-z]+)(?:[\?#]|$)/i;
var extension = file.match(regexp);
return extension && extension[1];
}
console.log(getFileExtension("https://www.example.com:8080/path/name/foo"));
console.log(getFileExtension("https://www.example.com:8080/path/name/foo.BAR"));
console.log(getFileExtension("https://www.example.com:8080/path/name/.quz/foo.bar?key=value#fragment"));
console.log(getFileExtension("https://www.example.com:8080/path/name/.quz.bar?key=value#fragment"));