从文件名javascript中删除非法字符

时间:2014-12-10 23:13:31

标签: javascript html html5

我已经看过关于这个主题的各种帖子,但是当我执行以下操作时,我得到了一个奇怪的结果:

var dirtyString = '<>I\really|\re\ad?"the/wh\ole*:da|\y?.'
var cleanString = dirtyString.replace(/[\/:*?"<>|.]/g, "");
console.log(cleanString);

删除所有非法字符,但&#34; r&#34;字母也被删除。在控制台日志中,我得到了&#34; Ieallyeadthewholeday&#34;似乎&#34; \&#34;之前&#34; r&#34;擦除&#34; r&#34;。 &#34; \&#34;没有删除之前的其他字母。我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

\r是回车符。如果你想要一个反斜杠后跟r,那么你需要转义反斜杠:\\r

\y不是保留的转义序列,因此JavaScript会将其解释为\,后跟y。其他编程语言(如C#)将引发有关无法识别的转义序列的编译器错误。

进一步混淆的事情:大多数正则表达式语法都有自己的反斜杠转义序列,这些转义序列与托管语言不同,例如字符类\W\d等。幸运的是它们的工作原因是{ {1}}和\W不是在JavaScript中保留的,但是在这位作者看来,有意义的是逃避反斜杠然后只是为了让读者真正清楚,或者你想让你的正则表达式是便携式的语言之间。

答案 1 :(得分:1)

如果您尝试console.log(dirtyString),您也会看到您的“r”也“丢失”。

这是因为'\ r'实际上是回车符字符的转义序列(代码13)。你的replace()对它没有任何作用。它仍然只是没有显示。尝试使用String.charAt()String.charCodeAt()进行游戏,您会看到角色仍在那里。

作为旁注,您试图删除“列入黑名单”的字符,并且黑名单几乎从不正确的方法。正如您在自己的案例中所看到的,您忘记将'\ r'字符(和许多其他字符)列入黑名单。白名单更安全。例如,您可以决定只接受拉丁字母和数字,然后删除未列入白名单的所有内容:var cleanString = dirtyString.replace(/[^a-z0-9]/gi, "");