【问题标题】:Return string without trailing slash返回不带斜杠的字符串
【发布时间】:2011-10-04 13:56:55
【问题描述】:

我有两个变量:

site1 = "www.somesite.com";  
site2 = "www.somesite.com/";  

我想做这样的事情

function someFunction(site)
{
    // If the var has a trailing slash (like site2), 
    // remove it and return the site without the trailing slash
    return no_trailing_slash_url;
}

我该怎么做?

【问题讨论】:

标签: javascript string trailing-slash


【解决方案1】:

试试这个:

function someFunction(site)     
{     
    return site.replace(/\/$/, "");
} 

【讨论】:

  • 要处理带有多个斜杠的情况,您可以使用:return site.replace(/\/+$/, "");
  • "/".replace(/\/$/, "") 将是 ""。 “/”是一个有效的路径,它不应该被剥离。
  • 小心/\/+$/,在撰写本文时,这里的评论已被投票超过 150 次。它受 ReDoS 约束。在很多情况下这并不重要,但如果您在服务器端 Node.js 代码中使用它(例如),这可能是一个大问题。
  • @Trott 你能提出一些不易受到这种攻击的答案吗?
  • @Gourav function removeAllTrailingSlashes(str) {let i = str.length; while (str[--i] === '/'); return str.slice(0, i+1);}
【解决方案2】:
function stripTrailingSlash(str) {
    if(str.substr(-1) === '/') {
        return str.substr(0, str.length - 1);
    }
    return str;
}

注意:IE8 和更早版本不支持负 substr 偏移。如果您需要支持那些古老的浏览器,请改用str.length - 1

【讨论】:

  • 真的很喜欢这里使用的“古代”一词。
  • 函数 stripTrailingSlash(str) { if(str.startsWith("/")) { return str.substr(1, str.length - 1); } 返回字符串; } NOT FOR IE8... 谁使用 IE8?
【解决方案3】:

ES6 / ES2015 提供了一个 API 来询问一个字符串是否以某物结尾,这使得编写一个更干净、更易读的函数成为可能。

const stripTrailingSlash = (str) => {
    return str.endsWith('/') ?
        str.slice(0, -1) :
        str;
};

【讨论】:

  • 2019 年最佳解决方案?
  • @PaulRad 使用此解决方案时,在单元测试中此行未涵盖 str.slice(0, -1) 分支的问题。如何解决这个问题?
  • @BijayRai 这意味着您的测试缺少str/ 斜线结尾的情况。您应该有两个断言(或两个测试),一个带有斜线,一个没有。
【解决方案4】:

我会使用正则表达式:

function someFunction(site)
{
// if site has an end slash (like: www.example.com/),
// then remove it and return the site without the end slash
return site.replace(/\/$/, '') // Match a forward slash / at the end of the string ($)
}

不过,您需要确保变量 site 是一个字符串。

【讨论】:

  • 我完全同意,无论何时你编写正则表达式,它都应该用描述性名称或 cmets 包装在一个函数中。
【解决方案5】:

根据@vdegenne 的回答...如何剥离:

单斜杠:

theString.replace(/\/$/, '');

单个或连续的尾随斜杠:

theString.replace(/\/+$/g, '');

单斜杠:

theString.replace(/^\//, '');

单个或连续的前导斜杠:

theString.replace(/^\/+/g, '');

单个前导和尾随斜杠:

theString.replace(/^\/|\/$/g, '')

单个或连续的前导和尾随斜杠:

theString.replace(/^\/+|\/+$/g, '')

要同时处理斜杠和反斜杠,请将\/ 的实例替换为[\\/]

【讨论】:

  • 这里的一些解决方案,例如 /\/+$/g 容易受到 ReDoS 的影响,因此例如在服务器端代码上使用时必须小心。
【解决方案6】:

我知道这个问题是关于斜杠的,但我在搜索修剪斜杠时发现了这篇文章(在字符串文字的尾部和头部),因为人们需要这个解决方案,我在这里发布一个:

'///I am free///'.replace(/^\/+|\/+$/g, ''); // returns 'I am free'

更新

正如 @Stephen R 在 cmets 中提到的,如果你想在字符串文字的尾部和头部同时删除斜杠和反斜杠,你会写:

'\/\\/\/I am free\\///\\\\'.replace(/^[\\/]+|[\\/]+$/g, '') // returns 'I am free'

【讨论】:

  • 这才是真正的答案!
  • 如果你想同时修剪斜线和反斜线:.replace(/^[\\/]+|[\\/]+$/g, '')
  • 这个答案中的解决方案会受到 ReDoS 攻击,因此如果它们被用于服务器端代码(例如使用 Node.js 或 deno),您可能希望避免它们。根据路径的来源,您可能还需要谨慎使用浏览器代码。
【解决方案7】:

这个sn-p更准确:

str.replace(/^(.+?)\/*?$/, "$1");
  1. 它不会去除 / 字符串,因为它是一个有效的 url。
  2. 它会去除带有多个尾部斜杠的字符串。

【讨论】:

  • 虽然这可能是删除多个斜杠的有效方法,但这不是 OP 的要求。
  • @JonL。许多人浏览堆栈溢出来寻找答案。我发现这个答案比接受的答案更有帮助。
  • 我认为这更简单 -> (.+?)\/+$。一开始不需要使用^,因为.无论如何都会从头开始搜索,不需要在$之前使用*?,因为它会在正则表达式模式不匹配时返回原始字符串。
  • 这个答案很容易受到 ReDos 的影响,应该避免在服务器端代码和其他需要 ReDoS 攻击的环境中使用。
【解决方案8】:

这里是一个小 url 示例。

var currentUrl = location.href;

if(currentUrl.substr(-1) == '/') {
    currentUrl = currentUrl.substr(0, currentUrl.length - 1);
}

记录新的网址

console.log(currentUrl);

【讨论】:

    【解决方案9】:
    function stripTrailingSlash(text) {
        return text
            .split('/')
            .filter(Boolean)
            .join('/');
    }
    

    另一种解决方案。

    【讨论】:

      【解决方案10】:

      我知道的最简单的方法是这样的:

      function stripTrailingSlash(str){
         if(str.charAt(str.length-1) == "/"){ str = str.substr(0, str.length - 1);}
         return str
      }
      

      更新 ES2015 版本。

      const stripTrailingSlash = str=>str.charAt(str.length-1)=="/"?str.substr(0,str.length-1):str;
      

      然后,这将检查末尾是否有 /,如果存在,则将其删除。如果不是,它将按原样返回您的字符串。

      修复了字符串上从零开始的索引的计算。

      编辑: 由于对一个响应有评论,现在有更多的人在做同样的事情,不要使用子字符串进行比较,当您可以使用 charAt 获取时,您正在内存中(在低级别)创建一个全新的字符串一个字符的内存要少得多来进行比较,Javascript 仍然是 JIT 并且无法对任何语言进行优化,尽管编译器可以做到这一点,它不会为你解决这个问题。

      【讨论】:

        【解决方案11】:
        function someFunction(site) {
          if (site.indexOf('/') > 0)
            return site.substring(0, site.indexOf('/'));
          return site;
        }
        

        【讨论】:

        • subtring?除此之外,它还删除了第一个斜线及其之后的所有内容。
        • @ThiefMaster:真的吗?你看不出我的意思是substring?同样是的,我的意思是删除第一个斜杠及其后面的所有内容,因为它确实满足了发布的问题和示例数据的要求。
        • 好吧,他的评论说他想删除尾部的斜杠
        • @ThiefMaster:根据他的例子,我的代码就是这样。
        • 如果 url 更改为“完全合格”有 http:// 这将不起作用并且任何中间带有 / 的链接都不起作用 为谷歌员工
        猜你喜欢
        • 2018-05-20
        • 1970-01-01
        • 1970-01-01
        • 2020-04-18
        • 2014-09-16
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2023-04-04
        相关资源
        最近更新 更多