Javascript 如何返回没有任何扩展名的文件名?

Javascript 如何返回没有任何扩展名的文件名?,javascript,jquery,Javascript,Jquery,我使用下面的代码从url获取文件名,但是当有一个#和数字时,它不能完全工作。我怎样才能得到文件名,使它只返回“somefilename”或“somename”?各种场景的一些示例 文件格式示例 1. www.something.com/somefilename.html#108 or 2. www.someting.com/group//somename.shtml or 3. www.something.com/group/somename#1011 Jasva

我使用下面的代码从url获取文件名,但是当有一个#和数字时,它不能完全工作。我怎样才能得到文件名,使它只返回“somefilename”或“somename”?各种场景的一些示例

文件格式示例

     1. www.something.com/somefilename.html#108
or
     2. www.someting.com/group//somename.shtml
or
     3. www.something.com/group/somename#1011
Jasvascript

   $(document).ready(function() {
     var url=window.location.href;
     var filename = url.substring(url.lastIndexOf('/')+1);
     alert(" filename " +filename);
     var cleanfilename =filename.slice(0, -5)
     alert(" cleanfilename" +cleanfilename);
    alert($('#business-type :selected').val());
    $('select[id^="business-type"] option[value='+cleanfilename+']').attr("selected","selected");


    });

以下说明适用于这些类型的所有文件:

www.something.com/somefilename.html#108
www.someting.com/group//somename.shtml
www.something.com/group/somename#1011
假设我们将这样做:

  • 假设文件名存储在此变量中:

    var filename = "www.something.com/somefilename.html#108";
    
  • 获取文件名部分。所以,我们需要得到/的最后一项

    filename = filename.split("/");
    filename = filename[filename.length - 1]; // Get the last one.
    
  • 现在用
    #
    拆分它,不管它是否有字符,并获取第一个字符

    filename = filename.split("#");
    filename = filename[0]; // Get the first one.
    
  • 现在获取不带扩展名的文件名:

    filename = filename.substr(0, filename.lastIndexOf(".") - 1);
    filename = filename[0]; // Get the filename.
    
  • 完整的功能将是:

    function getFilename (filename) {
        filename = filename.split("/");
        filename = filename[filename.length - 1];
        filename = filename.split("#");
        filename = filename[0];
        filename = filename.substr(0, filename.lastIndexOf(".") - 1);
        filename = filename[0];
        return filename;
    }
    

    您可以使用
    substring
    lastIndexOf
    函数来实现这一点。比如:

    输入示例:

    var link = "www.something.com/somefilename.html#108"
    
    代码:

    输出:

    "somefilename"
    
    编辑:

    如果链接类似于
    www.something.com/somefilename.html#108/5.2
    ,那么以下内容可能会有所帮助:

    var linkWithoutHash = link.substring(0, link.lastIndexOf("#"));
    var fileName = linkWithoutHash.substring(linkWithoutHash .lastIndexOf("/") + 1, linkWithoutHash .lastIndexOf("."));
    console.log(fileName);
    
    我会去的

    var filename = document.location.pathname.match(/([^/]*?)(?:\..*)?$/)[1]
    

    这只需两行代码即可完成:

    var a = location.pathname.split("/").pop();
    a.substring(0, a.indexOf('.'));
    
    .split(“/”).pop()
    检索URL最后一个
    /
    之后的部分,不包括散列(
    #
    )或搜索(
    )属性

    .substring(0,a.indexOf('.')
    删除
    之后的所有内容,删除文件扩展名


    在我的机器上,这个过程总共需要0.092ms,而使用regex的方法需要0.253ms。如果这一微小的时差对您来说并不重要,那么使用regex总体来说会稍微短一些,也更简单一些。

    我的简单想法:

    • 将文件路径拆分为字符数组
    • 向后迭代,将每个字符累积为文件名
    • 只要它看到
      #
      ,就将文件名重置为空字符串
    • 一旦点击一个
      /
      ,就结束
    我们开始:

    var paths = [ 'www.something.com/somefilename.html#108',
            'www.someting.com/group//somename.shtml',
            'www.something.com/group/somename#1011',
            'ftp://somewhere.somedot/f/f/name',
            'ftp://somewhere.somedot/var1/var2/filename.dot.dot',
            'dir/naked_filename.etc'];
    
    function extractName(s){
        var chars = s.split('');
        var c = chars.pop();
        var filename = '';
        while (c!='/' && chars.length>0){
            if (c=='#' || c=='.') filename = '';
            else filename = c + filename;
            c = chars.pop();
        }
        return filename;
    }
    
    console.log( paths.map(extractName) );
    // [ "somefilename", "somename", "somename", "name", "filename", "naked_filename"]
    

    不要使用完整的<代码> HeRF,考虑使用另一个<代码>位置< /COD>属性来启动搜索,例如“代码>窗口。位置。路径名< /代码>”,它可以为您去掉查询字符串和位置片段。您只需将“扩展名”(如果存在)从末尾去掉即可。
    location.hash
    也可以包含斜线和点(“…filename.html#108/5.2”),因此这种方法不是防弹的。@myf感谢您的解释。相应地更新了答案。我投票给@MuhammadImran,因为如果文件名有几个点,这会起作用。我用您在答案中提供的示例URL尝试了这一点,结果返回“s”:(这里也一样,我刚得到的文件名“r”不是很完美!它完成了OP要求的所有功能。但是,如果在文件名中有一个额外的点(在扩展名之前):
    var filename=document.location.pathname.match(/([^/]*?)(?:\.[^.]*)?$/)[1]
    var paths = [ 'www.something.com/somefilename.html#108',
            'www.someting.com/group//somename.shtml',
            'www.something.com/group/somename#1011',
            'ftp://somewhere.somedot/f/f/name',
            'ftp://somewhere.somedot/var1/var2/filename.dot.dot',
            'dir/naked_filename.etc'];
    
    function extractName(s){
        var chars = s.split('');
        var c = chars.pop();
        var filename = '';
        while (c!='/' && chars.length>0){
            if (c=='#' || c=='.') filename = '';
            else filename = c + filename;
            c = chars.pop();
        }
        return filename;
    }
    
    console.log( paths.map(extractName) );
    // [ "somefilename", "somename", "somename", "name", "filename", "naked_filename"]