返回不带斜杠的字符串
Posted
技术标签:
【中文标题】返回不带斜杠的字符串【英文标题】: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;
我该怎么做?
【问题讨论】:
JQuery check and remove slash from the end of URL read的可能重复 【参考方案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");
-
它不会去除
/
字符串,因为它是一个有效的 url。
它会去除带有多个尾部斜杠的字符串。
【讨论】:
虽然这可能是删除多个斜杠的有效方法,但这不是 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:// 这将不起作用并且任何中间带有 / 的链接都不起作用 为谷歌员工以上是关于返回不带斜杠的字符串的主要内容,如果未能解决你的问题,请参考以下文章
序列化包含转义(反斜杠和双引号)的 JSON 字符串 Swift 返回格式错误的对象