所以我试图解析一个类似于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?
但就像我说的那样,并没有完全告诉我我正在寻找的东西。
如何调整代码以提供我想要的内容?
答案 0 :(得分:1)
在使用连字符更改所有空格之前使用trim
。
您可以使用此功能:
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;
答案 1 :(得分:1)
您需要进行2次更改:
replace
替换所有空格,你需要用第二个正则表达式替换所有空白字符(因此,普通空格必须用\s
替换,甚至更好, \s+
替换多个连续出现次数),trim()
。所以,实际的修复方法看起来像
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;
请注意,如果您将-
添加到第一个正则表达式/[^a-z0-9\s-]/ig
,您还会在输出中保留原始连字符,对于当前的测试用例,它看起来像this-is-a-66-test-tag
。