正则表达式:允许任何字符,但不包括一些特定字符。

7
我想验证一个文本框,但我不太懂正则表达式(花了我一整天的时间和很多教程才明白)。基本上,我想允许所有内容(包括换行和回车),但排除那些可能导致安全漏洞的字符。由于不允许的字符很少,所以我认为创建黑名单比创建白名单更有意义。我的问题是:正则表达式中标准的“everything but”是什么?我正在使用JavaScript和jQuery。我尝试过下面这个,但它不起作用(我知道它很糟糕…):
var messageReg = /^[a-zA-Z0-9éèêëùüàâöïç\"\/\%\(\).'?!,@$#§-_ \n\r]+$/;

谢谢您。

1
你说的“不起作用”是什么意思?使用该正则表达式的代码是什么? - Ruan Mendes
4
这不会对安全性产生任何影响。即使没有使用浏览器(因为它只是某种类型的HTTP请求),也可以提交表单而无需使用JavaScript。 - Esailija
1
正则表达式并不是防止安全漏洞的正确方式。这个帖子可能会引起兴趣。防御XSS并不是通过正则表达式实现的。 - sQVe
1
你想要接受什么,又想要排除什么? - Toto
1
@Baylock "我试图输入一个尖括号" 无法告诉我您用于剥离它的代码,您可能没有正确使用它,请参考我的答案。 - Ruan Mendes
显示剩余3条评论
3个回答

23

如果你想要排除一组字符(比如一些标点符号),你可以在正则表达式中的字符集开头使用 ^ 运算符,例如:

/[^.?!]/

这将匹配任何不是.?!的字符。


2
在 Stack Overflow 上,我们通常更喜欢您使用投票而不是评论来表示问题有帮助,因为这样的评论通常被认为是噪音,而投票对其他人更有用。 - murgatroid99
1
是的,我这么做的原因是我不知道如何在这里投票。我只能检查一个绿色标记的能力。但是只允许一个标记,并且有太多好答案。我正在努力弄清楚这件事,但仍然没有头绪。 - Baylock
2
你应该能够点击向上或向下箭头来投票。 - murgatroid99
1
谢谢。不久前,我还无法做到这一点。不管怎样,我已经投票了! - Baylock
2
@Baylock 在达到一定的声望之后,您才能进行投票,这就是为什么您以前无法进行投票的原因。 - Ruan Mendes

8
您可以在方括号[]内使用^作为第一个字符来否定其中的内容:
/^[^abc]*$/

这句话的意思是:“从头到尾,没有任何 a b c 。”

2
如Esailija所述,这样做对于真正的安全性没有任何作用。
你提到的代码几乎是一个否定集合,正如murgatroid99所说,^应该放在括号里面。因此,正则表达式将匹配不在该列表中的任何内容。但看起来你真的想去掉这些字符,所以你的正则表达式不需要被否定。
你的代码应该像这样:
str.replace(/[a-zA-Z0-9éèêëùüàâöïç\"\/\%\(\).'?!,@$#-_ \n\r]/g, "");

这意味着删除我正则表达式中的所有字符。

然而,这意味着你不想保留 a-zA-Z0-9,你确定要去掉它们吗?

此外,Chrome 不支持在正则表达式中使用 §,你必须使用该字符的十六进制码和 \x


1
基本上,我想允许那些字符(它是一个大集合,但后来会减轻一些重量)。谢谢你的解释。 - Baylock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接