【问题标题】:Javascript Replace Certain Characters of href after the last slash /Javascript在最后一个斜杠后替换href的某些字符/
【发布时间】:2016-05-27 08:09:50
【问题描述】:

我有这个标签

<a id="Link" href="mysite.net/K&N abc 123.html">Link</a>

我需要使用 JavaScript 删除非字母数字字符,然后用破折号 - 替换空格并将结果小写。

所以/K&amp;N abc 123.html 之后的所有内容都保持不变。

最终的结果应该是这样的

<a id="Link" href="mysite.com/kn-abc-123.html">Link</a>

我有一些代码要开始,但还没有完全把它放在一起给出正确的结果。

var str = document.getElementById("Link").getAttribute("href");
str = str.replace(/\W+/g, '-').toLowerCase();
document.getElementById('Link').setAttribute("href",str);

【问题讨论】:

  • 为什么不encodeURIComponent()

标签: javascript regex replace href


【解决方案1】:

这是一个垃圾桶。 https://jsbin.com/gojoseduji/3/edit?html,output

var href = document.getElementById("Link").getAttribute('href');
var str = href
  // replace each block of whitespace with a single '-' character
  .replace(/\s+/g, '-')
  // Filter out non alphanumerics, excluding : / -
  .replace(/[^\:\/\-\w\s.]+/g, "")
  // get rid of any hyphens that follow a slash
  .replace(/\/-/g, '/')
  .toLowerCase();

我只是使用了空白标识符,并确保将其设为全局 :)

编辑:添加了去除除 [/ - :] 之外的所有非字母数字的条件。我先去掉了空格,然后让第二个正则表达式忽略连字符。我还使变量名称不同,因为您的原始代码修改了变量。只是我的喜好。

EDIT-AGAINN:这种原始方式很好,但现在有一些不同的正则表达式,也许具有更流畅正则表达式技能的人可以将它们浓缩并做出更好的答案?

【讨论】:

  • 你忘了非字母数字
  • 效果很好。您将如何编辑正则表达式以直接在 / 之后和 . 之前删除空格,而不是用连字符替换。这个www.site.com/ K&amp;N 33 cc .htmlwww.site.com/kn-33-cc.html
  • 没关系。我只是在 .replace 正则表达式开始之前使用 trim() 修剪空白:D
  • 是的,实际上你会怎么做? trim() 没有这样做。
  • 我编辑了代码以进行调整,只需使用正则表达式来搜索“/-”的出现。尽管现在有很多不同的步骤和正则表达式,但代码异味正在出现。也许拥有更多 RegExp 技能的人可以将其浓缩?
【解决方案2】:

试试这个

var str = document.getElementById("Link").getAttribute("href");

var lastitem = str.split("/").pop(); //taking out last item after slash 

lastitem = lastitem.split( " " ).map( function(value){ return value.replace(/[*\(\)&/]/g, '').toLowerCase() } ).join( "-" );    //removing special characters and replacing space with hyphen

str = str.substring(0, str.lastIndexOf("/")) + lastitem;

document.getElementById('Link').setAttribute("href",str);

【讨论】:

  • 这个有效,但它也从 url 中删除了最后一个斜杠。 :D
【解决方案3】:

您可以将replacecallback 一起使用:

var href = document.getElementById("Link").getAttribute('href');

href = href.replace(/^((?:.*?\/{2})?[^\/]*\/)(.+)$/, function($0, $1, $2) {
      return $1 + $2.replace(/[^\w\s.]+/g, '').replace(/\s+/g, '-').toLowerCase(); });

document.getElementById('Link').setAttribute("href", href);
//=> mysite.net/kn-abc-123.html

或在 URL 中使用ftp://

str = 'ftp://mysite.net/K&N abc 123.html'

str = str.replace(/^((?:.*?\/{2})?[^\/]*\/)(.+)$/, function($0, $1, $2) {
      return $1 + $2.replace(/[^\w\s.]+/g, '').replace(/\s+/g, '-').toLowerCase(); });

//=> ftp://mysite.net/kn-abc-123.html

【讨论】:

  • 你误会了。链接并不总是K&amp;N abc 123.html 我只是以它为例。该代码需要删除所有空格并替换为- 以及删除非字母数字字符。
  • 代码需要删除所有空格并替换为 - 在您的示例中,所有空格都替换为连字符,所有非单词字符都被删除,除了 .html 中的 DOT(你没有澄清的问题)。顺便说一句,Remove 不同于 Replace
  • 好的,抱歉。一个简单的说法是,删除非字母数字字符。用连字符替换空格。不要更改最后一个正斜杠之前的任何内容。
  • 和你一样str.replace(/\/.*$/, function($0) { return '/' + $0.replace(/[^.\w\s]+/g, '').replace(/\s+/g, '-').toLowerCase(); });.
  • @Mike:如您所见,这个答案已经在做。但是 DOT 也是一个非字母数字字符,如果我们删除它,它也会变成 kn-abc-123html 而不是 kn-abc-123.html
猜你喜欢
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 2015-07-29
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多