返回不带尾部斜杠的字符串。

282

我有两个变量:

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;
}

我该怎么做?


1
可能是JQuery检查并删除URL末尾的斜杠的重复问题。 - Hugo
12个回答

624

试试这个:

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

166
为了处理包含多个尾随斜杠的情况,您可以使用以下代码: return site.replace(/\/+$/, ""); 该代码将删除站点字符串末尾的所有斜杠。 - mikermcneil
19
"/".replace(//$/, "")的结果是""。"/"是一个有效的路径,不应该被剥离。 - puchu
4
在这里要小心/\/+$/,它是一个被点赞150次的注释。它容易受到ReDoS攻击。在很多情况下这并不重要,但如果你在服务器端的Node.js代码中使用它可能会成为一个大问题。 - Trott
1
@Trott,你能提供一些不容易受到攻击的解决方案吗? - Gourav
3
@Gourav function removeAllTrailingSlashes(str) {let i = str.length; while (str[--i] === '/'); return str.slice(0, i+1);}@Gourav 函数removeAllTrailingSlashes(str) {let i = str.length; while (str[--i] === '/'); return str.slice(0, i+1);} - Trott
显示剩余3条评论

96

ES6 / ES2015提供了一个API来查询一个字符串是否以某个内容结尾,这使得编写更加简洁和易读的函数成为可能。

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

5
2019年最佳解决方案 - Paul Rad
@PaulRad 在使用这个解决方案时,单元测试中出现了“str.slice(0, -1)”分支未覆盖的问题。如何解决? - Bijay Rai
1
@BijayRai 这意味着你的测试缺少一个以 / 斜杠结尾的情况。你应该有两个断言(或两个测试),一个带斜杠,一个不带。 - Seth Holladay

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

注意:IE8及更早版本不支持负数的子字符串偏移量。如果您需要支持这些古老的浏览器,请改用str.length - 1


1
真的很喜欢这里使用“古老”的术语。 - PageSource
函数stripTrailingSlash(str) { 如果(str.startsWith("/")) { 返回str.substr(1, str.length - 1); } 返回str; }不支持IE8... 谁还在用IE8? - Mitja Gustin

34

我会使用正则表达式:

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是一个字符串。


3
完全同意,任何时候你编写正则表达式,都应该用具有描述性名称或注释的函数来包装它。 - Eric Labashosky

28

基于 @vdegenne 的回答... 如何去除:

单个尾部斜杠:

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

单个或连续的尾部斜杠:

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

单个开头斜杠:

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

单个或连续的开头斜杠:

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

单个开头和尾部斜杠:

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

单个或连续的开头和尾部斜杠:

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

为了处理正斜杠和反斜杠,使用 [\\/] 替换 \/


2
这里的一些解决方案,例如/\/+$/g容易受到ReDoS攻击,因此如果在服务器端代码中使用,必须小心。 - Trott

21

我知道这个问题是关于尾随斜杠的,但在我的搜索中,我发现了这篇帖子,它涉及修剪斜杠(字符串字面量的尾部和开头),由于人们需要这个解决方案,因此我在这里发布一个:

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

更新:

正如@Stephen R在评论中提到的那样,如果要同时删除字符串字面值的开头和结尾处的斜杠和反斜杠,您应该编写:

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

这才是真正的答案! - Can PERK
2
如果您想修剪斜杠和反斜杠:.replace(/^[\\/]+|[\\/]+$/g, '') - Stephen R
此答案中的解决方案容易受到 ReDoS 攻击,因此如果在服务器端代码中使用(例如使用 Node.js 或 deno),您可能希望避免使用它们。根据路径的来源,您也可能需要在浏览器代码中小心使用。 - Trott

12

这段代码更为准确:

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

虽然这可能是一种有效的方法来删除多个斜杠,但这不是OP的请求。 - Jon L.
@JonL。许多人浏览Stack Overflow以寻找答案。我发现这个答案比被接受的答案更有帮助。 - Ronnel Martinez
我认为这更简单 -> (.+?)\/+$。一开始不需要使用^,因为.会从开头开始搜索,也不需要在$之前使用*?,因为当正则表达式模式不匹配时,它将返回原始字符串。 - doctorgu
这个答案非常容易受到ReDos攻击的影响,因此在服务器端代码和其他可能受到ReDoS攻击的情况下应该避免使用。 - Trott

4
function stripTrailingSlash(text) {
    return text
        .split('/')
        .filter(Boolean)
        .join('/');
}

另一种解决方案。


如果你的字符串包含“/”,那么这个程序将无法正常工作。 - vivek gupta
这对于URL不起作用 - 你将会把http://改成http:/ - Abhishek

3
我知道的最简单方法是这样的:
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,并不能像通过编译器的任何语言那样进行优化,它不会为你解决这个问题。


2

这里是一个小的URL示例。

var currentUrl = location.href;

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

记录新的URL
console.log(currentUrl);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接