返回不带斜杠的字符串

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:// 这将不起作用并且任何中间带有 / 的链接都不起作用 为谷歌员工

以上是关于返回不带斜杠的字符串的主要内容,如果未能解决你的问题,请参考以下文章

base64EncodedString 返回不需要的反斜杠

Json.NET在返回json序列化字符串时添加反斜杠

序列化包含转义(反斜杠和双引号)的 JSON 字符串 Swift 返回格式错误的对象

PHP 字符串整理归类

fastjson 返回json字符串,JSON.parse 报错

jQuery返回不带逗号的字符串的前5个单词