除了字母和数字之外的所有内容,并用连字符替换句子中的空格

时间:2017-11-23 14:10:17

标签: javascript regex

所以我试图解析一个类似于StackOverflow标签工作方式的字符串。因此允许使用字母和数字,但其他所有内容都应该被删除。空格也应该用连字符替换,但前提是它们在单词内并且在它们之前没有不允许的字符。

这就是我现在所拥有的:

label = label.trim();
label = label.toLowerCase();
label = label.replace(/[^A-Za-z0-9\s]/g,'');
label = label.replace(/ /g, '-');

这有效,但有一些警告,例如:

 / this. is-a %&&66 test tag    .   <-- (4 spaces here, the arrow and this text is not part of the test string)

变为:

-this-is-a66-test-tag----

预期:

this-is-a66-test-tag

我看了这个就得到了我现在拥有的东西:

How to remove everything but letters, numbers, space, exclamation and question mark from string?

但就像我说的那样,并没有完全告诉我我正在寻找的东西。

如何调整代码以提供我想要的内容?

2 个答案:

答案 0 :(得分:1)

在使用连字符更改所有空格之前使用trim

您可以使用此功能:

&#13;
&#13;
function tagit(label) {
label = label.toLowerCase().replace(/[^A-Za-z0-9\s]/g,'');
return label.trim().replace(/ /g, '-'); }

var str = 'this. is-a %&&66 test tag    .'

console.log(tagit(str));
//=> "this-isa-66-test-tag"
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您需要进行2次更改:

  • 由于你没有用第一个replace替换所有空格,你需要用第二个正则表达式替换所有空白字符(因此,普通空格必须用\s替换,甚至更好, \s+替换多个连续出现次数),
  • 要在最后删除前导/尾随连字符,请在第一次替换后使用trim()

所以,实际的修复方法看起来像

&#13;
&#13;
var label = " / this. is-a %&&66 test tag    .   ";
label = label.replace(/[^a-z0-9\s-]/ig,'')
  .trim()
  .replace(/\s+/g, '-')
  .toLowerCase();
console.log(label); // => this-isa-66-test-tag
&#13;
&#13;
&#13;

请注意,如果您将-添加到第一个正则表达式/[^a-z0-9\s-]/ig,您还会在输出中保留原始连字符,对于当前的测试用例,它看起来像this-is-a-66-test-tag