正则表达式:允许除某些选定字符之外的所有内容[重复]

Posted

技术标签:

【中文标题】正则表达式:允许除某些选定字符之外的所有内容[重复]【英文标题】:Regex: allow everything but some selected characters [duplicate] 【发布时间】:2012-08-19 07:47:08 【问题描述】:

我想验证一个文本区域,但我没有得到正则表达式(我花了一天的时间和一堆教程才弄明白)。

基本上我希望能够允许一切(包括换行符和战车),但可能是恶意的字符(那些会导致安全漏洞的字符)。 由于不允许使用的字符很少,我认为创建黑名单比创建白名单更有意义。

我的问题是:Regex 中的标准“除此之外的一切”是什么?

我正在使用 javascript 和 jquery。

我试过了,但它不起作用(这很糟糕,我知道..):

var messageReg = /^[a-zA-Z0-9éèêëùüàâöïç\"\/\%\(\).'?!,@$#§-_ \n\r]+$/;

谢谢。

【问题讨论】:

它不起作用是什么意思?使用该正则表达式的代码是什么? 这不会对安全起任何作用。无需 javascript 甚至无需使用浏览器也可以提交表单(因为它只是某种类型的 HTTP 请求)。 RegEx 并不是真正避免安全漏洞的正确方法。这个thread 可能会感兴趣。 XSS 防御不是用正则表达式来完成的。 javascript 验证是为了节省用户等待服务器返回验证错误的时间。它对安全毫无用处。 你想接受什么,你想排除什么? 【参考方案1】:

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

/[^.?!]/

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

【讨论】:

在 Stack Overflow 上,我们通常更喜欢您使用投票而不是 cmets 来表示问题是有帮助的,因为这样的 cmets 通常被认为是噪音,而投票对其他人更有用。 是的,我这样做的原因是我不知道如何在这里投票。我所拥有的只是检查绿旗的能力。但是只允许一个标志和太多好的答案。我正在试图弄清楚这件事,但仍然没有任何线索。 你应该可以点击向上或向下箭头来投票赞成或反对 谢谢。不久前,我无法做到这一点。不管怎样,我投票了! @Baylock 你只能在某个代表之后投票赞成/反对,这就是为什么你以前不能【参考方案2】:

您可以使用^ 作为括号[] 内的第一个字符来否定其中的内容:

/^[^abc]*$/

这意味着:“从头到尾,没有abc。”

【讨论】:

【参考方案3】:

正如 Esailija 所说,这对真正的安全性没有任何帮助。

你提到的代码几乎是一个否定集,正如 murgatroid99 提到的,^ 放在括号内。因此,正则表达式将匹配不在该列表中的任何内容。但看起来你真的想去掉那些字符,所以你的正则表达式不需要被否定。

您的代码应如下所示:

str.replace(/[a-zA-Z0-9éèêëùüàâöïç\"\/\%\(\).'?!,@$#-_ \n\r]/g, "");

也就是说,删除我的正则表达式中的所有字符。

但是,这就是说您不想保留a-zA-Z0-9,您确定要删除它们吗?

另外,chrome 不喜欢正则表达式中的 §,您必须使用 \x 以及字符的十六进制代码

【讨论】:

基本上,我想允许这些角色(这是一个很大的集合,但它是为了以后减肥)。谢谢你的解释

以上是关于正则表达式:允许除某些选定字符之外的所有内容[重复]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:匹配除一个单词之外的所有内容[重复]

删除除 0-9 + - / * 和 ^ 之外的任何字符 [重复]

正则表达式,匹配除 \r \n 之外的所有内容作为普通字符

如何使用正则表达式替换除指定字符串之外的所有内容

正则表达式:匹配除特定模式之外的所有内容

从 PHP 中的字符串中删除除字母数字字符之外的所有内容