【问题标题】:remove everything before the last occurrence of a character删除最后一次出现字符之前的所有内容
【发布时间】:2012-05-26 16:07:19
【问题描述】:

我正在尝试对字符串执行以下操作:

  • 找到字符"/"的最后一次出现;
  • 删除该字符之前的所有内容;
  • 返回字符串的剩余部分;

更明确地说,假设我有以下字符串:

var string = "/Roland/index.php"; // Which is a result of window.location.pathname

现在我需要从中提取除实际页面之外的所有内容,如下所示:

var result = "index.php" // Which is what I need to be returned

当然,这只是一个例子,因为显然我会有不同的页面,但同样的原则适用。

我想知道是否有人可以帮助我解决这个问题。我尝试了接下来的操作,但没有成功:

var location = window.location.pathname;
var result = location.substring(location.lastIndexOf["/"]);

【问题讨论】:

  • 你很亲密。 lastIndexOf 是一个函数,如果 location 是一个全局变量,则不能覆盖它。所以它应该是:loc.substring(loc.lastIndexOf("/")) 并且因为您不想包含斜线本身:loc.substring(loc.lastIndexOf("/") + 1)

标签: javascript


【解决方案1】:

你有正确的想法,只需用括号替换括号。

var string = "/Roland/index.php";
var result = string.substring(string.lastIndexOf("/") + 1);

这是jsfiddle 中的一个示例,这里是Mozilla Developer Network 中.lastIndexOf() 方法的说明。

【讨论】:

  • 这将删除最后一次出现 之后的所有内容。 OP 想要删除 之前 的所有内容。实际上应该是location.substring(location.lastIndexOf("/") + 1)
  • 这就是我正在使用的,除了那里的0 与我需要的相反:)
  • 对不起 Roland,我误读了你的问题,并认为你想要一切都在斜线之前。是的,只需删除 0 参数,你就会得到你想要的,你唯一的问题是不正确的括号。
  • 我认为 Michael 的答案在这里更好,因为如果您传入一个没有“/”的字符串并且该行将在 -1 上阻塞,您将遇到异常。所以,至少你会想用我的编辑来保护......
【解决方案2】:

我个人会使用正则表达式:

var result = string.replace(/^.*\/(.*)$/, "$1");

如果您熟悉正则表达式(如果不熟悉,您应该熟悉 :-),那么它就不会像不熟悉时那样陌生。

前导 ^ 强制此正则表达式将匹配“锚定”在字符串的开头。 \/ 匹配单个 / 字符(\ 是为了防止 / 混淆正则表达式解析器)。然后(.*)$ 匹配从/ 到字符串末尾的所有其他内容。最初的.* 将尽可能多地吞下,包括最后一个之前的/ 字符。替换文本"$1" 是一种特殊形式,表示“第一个匹配组的内容”。这个正则表达式有一个组,由最后一个.*(在(.*)$)周围的括号组成。这将是最后一个/ 之后的所有内容,因此总体结果是整个字符串被替换为这些内容。 (如果由于没有任何 / 字符而导致模式不匹配,则不会发生任何事情。)

【讨论】:

  • 不,我很熟悉,我在PHP中使用它但在JS中较少使用它
【解决方案3】:

将字符串拆分为/.pop() 上最后一个元素上的数组。请注意,如果有斜杠,您首先需要去掉斜杠。

var locationstring = window.location.pathname;
// replace() the trailing / with nothing, split on the remaining /, and pop off the last one
console.log(locationstring.replace(/\/$/, "").split('/').pop());

如果在像 /path/stuff/here/ 这样的 URL 的情况下,您有尾随 /,如果这种情况应该返回一个空字符串而不是 here,请修改上述内容以从调用链中删除 .replace() .我假设您会想要最后一个组件,而不考虑尾部斜杠,但可能假设错误。

console.log(locationstring.split('/').pop());

【讨论】:

  • 我认为我的解决方案更简洁,但无论如何您都需要在“/”上将该数组重新连接在一起,否则您会得到没有 / 的部分。
  • 我不喜欢使用.pop() :)
  • @Dr. Dredel OP 不需要字符串的其余部分,只需要最后一部分,因此无需将其重新连接在一起
  • 哦,我误读了这个问题(或者可能是 OP 已编辑?不确定)我以为他想要一切都到最后一个斜线。对于所述问题,您的方法显然很好。
  • @Dr.Dredel 我同意,在要求“从中提取所有内容”时存在混淆——当您提取时,您通常希望保留它,但在这种情况下,它应该是“remove all up to”。
【解决方案4】:
    var result = /\/([^\/]*)$/.exec(location)[1];

//"remove-everything-before-the-last-occurrence-of-a-character#10767835"

注意:location 这里是window.location,而不是你的var location

【讨论】:

    【解决方案5】:
    var string = "/Roland/index.php";
    var result = string.substring(0, string.lastIndexOf("/") + 0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 2020-10-11
      相关资源
      最近更新 更多