RegEx 函数无法删除非法字符?
RegEx function failing to remove illegal chars?
据我所知,我的 RegEx 是正确的,替换方法应该是正确的。查看答案 here and here,我似乎使用了相同或非常相似的 RegEx 模式,并且它们是公认的答案。
所以我在想,也许我对 .replace 方法做错了什么?
理想情况下,RegEx 应该匹配字符 class 中包含的任何 不 ,意思是任何不是:a-z、0-9、'-'、' 。', 和 '_'。我读到不需要转义字符 classes 中的特殊字符(“[”、“]”和“-”除外),所以我只转义了连字符。
非常感谢任何帮助。澄清;将此字符串传递给以下函数:
'_;<!--Invalid--!"s"' null'
应该 return
____--invalid--____null
.
function nameSafe(name) {
var rgxIllegalChars = /^[^a-z0-9\-._]+$/;
name = name.toLowerCase();
return name.replace(rgxIllegalChars, '_');
}
编辑:已解决,请参阅已接受的答案以获取信息。完成的功能:
function nameSafe(name) {
var rgxIllegalChars = /[^a-z0-9\-._]+/gi;
return name.replace(rgxIllegalChars, '_');
}
我在我的函数中添加了一些调试输出以尝试捕获之前和之后的内容,但有点愚蠢地忘记了 .replace 实际上并没有替换原始字符串。所以我这样做了:
console.log(name);
name.replace(rgxIllegalChars, '_');
console.log(name);
return name;
抱歉 - 如果您也有问题,请永远不要忘记检查您的绝对基础知识(就像我一样)- 您使用的方法 return 是一个新对象,还是替换现有对象?
您只需要删除锚点:
function nameSafe(name) {
var rgxIllegalChars = /[^a-z0-9\-._]+/;
name = name.toLowerCase();
return name.replace(rgxIllegalChars, '_');
}
编辑:
var name = "'_;<!--Invalid--!\"s\"' null'";
var rgxIllegalChars = /[^a-z0-9\-._]+/g;
name = name.toLowerCase();
alert(name.replace(rgxIllegalChars, '_'));
注意这一行var rgxIllegalChars = /[^a-z0-9\-._]+/g;
在您的正则表达式中,^
表示 assert position at start of the string
,$
表示 assert position at end of the string
一旦您删除这两个,它就会给您预期的结果。
我已经在 Regex101.com 上为您创建了一个示例 https://regex101.com/r/xF7vA8/3,单击替换按钮查看结果。
据我所知,我的 RegEx 是正确的,替换方法应该是正确的。查看答案 here and here,我似乎使用了相同或非常相似的 RegEx 模式,并且它们是公认的答案。
所以我在想,也许我对 .replace 方法做错了什么?
理想情况下,RegEx 应该匹配字符 class 中包含的任何 不 ,意思是任何不是:a-z、0-9、'-'、' 。', 和 '_'。我读到不需要转义字符 classes 中的特殊字符(“[”、“]”和“-”除外),所以我只转义了连字符。
非常感谢任何帮助。澄清;将此字符串传递给以下函数:
'_;<!--Invalid--!"s"' null'
应该 return
____--invalid--____null
.
function nameSafe(name) {
var rgxIllegalChars = /^[^a-z0-9\-._]+$/;
name = name.toLowerCase();
return name.replace(rgxIllegalChars, '_');
}
编辑:已解决,请参阅已接受的答案以获取信息。完成的功能:
function nameSafe(name) {
var rgxIllegalChars = /[^a-z0-9\-._]+/gi;
return name.replace(rgxIllegalChars, '_');
}
我在我的函数中添加了一些调试输出以尝试捕获之前和之后的内容,但有点愚蠢地忘记了 .replace 实际上并没有替换原始字符串。所以我这样做了:
console.log(name);
name.replace(rgxIllegalChars, '_');
console.log(name);
return name;
抱歉 - 如果您也有问题,请永远不要忘记检查您的绝对基础知识(就像我一样)- 您使用的方法 return 是一个新对象,还是替换现有对象?
您只需要删除锚点:
function nameSafe(name) {
var rgxIllegalChars = /[^a-z0-9\-._]+/;
name = name.toLowerCase();
return name.replace(rgxIllegalChars, '_');
}
编辑:
var name = "'_;<!--Invalid--!\"s\"' null'";
var rgxIllegalChars = /[^a-z0-9\-._]+/g;
name = name.toLowerCase();
alert(name.replace(rgxIllegalChars, '_'));
注意这一行var rgxIllegalChars = /[^a-z0-9\-._]+/g;
在您的正则表达式中,^
表示 assert position at start of the string
,$
表示 assert position at end of the string
一旦您删除这两个,它就会给您预期的结果。
我已经在 Regex101.com 上为您创建了一个示例 https://regex101.com/r/xF7vA8/3,单击替换按钮查看结果。