C# 用于输入验证的Regex白名单-不区分重音

C# 用于输入验证的Regex白名单-不区分重音,c#,javascript,regex,validation,C#,Javascript,Regex,Validation,我希望能够将用户输入限制为有效字符的白名单,但我不希望阻止来自其他文化背景的人注册。 到目前为止,我有: ^[a-zA-Z0-9èéêëàáâãäçìíîïòóôõöùúûü-_]*$ 它允许大多数法语口音,但拉丁字符集中的口音列表是巨大的!我宁愿使用白名单而不是黑名单,以防我遗漏了什么 注意,这将是针对C#的,但我希望使用正则表达式进行客户端验证,以确保双方的一致性。当我将输入保存到数据库时,我正在对输入进行HTML编码 有没有一种更优雅的方法使正则表达式不区分重音,但仍然有足够的限制来防止

我希望能够将用户输入限制为有效字符的白名单,但我不希望阻止来自其他文化背景的人注册。 到目前为止,我有:

^[a-zA-Z0-9èéêëàáâãäçìíîïòóôõöùúûü-_]*$
它允许大多数法语口音,但拉丁字符集中的口音列表是巨大的!我宁愿使用白名单而不是黑名单,以防我遗漏了什么

注意,这将是针对C#的,但我希望使用正则表达式进行客户端验证,以确保双方的一致性。当我将输入保存到数据库时,我正在对输入进行HTML编码

有没有一种更优雅的方法使正则表达式不区分重音,但仍然有足够的限制来防止XSS?我不想疏远我的用户

我希望能够有一些标点符号,但不开放自己的XSS攻击,例如,我希望有人输入他们的公司名称:如果有人在雅虎工作!,他们应该能够注册

^\w+$

你不能只使用字母数字标志吗,我相信它接受重音。

在一些正则表达式实现中,一个简单的
\w
将涵盖所有这些。请参见

也许您可以使用unicode范围,如[\u00C0-\u017E]可能涵盖所有重音基础(但您应该检查字符映射以确保,因为我不知道意大利语有哪些重音)。

如果您想允许字母(带或不带变音符号)和一些标点符号,您可以使用:

^[\w_-]+$

其中\w代表任意字母,而-是允许的2个额外标点符号。别忘了在使用时将-放在末尾。

fwiw:我使用的是一个自制函数,该函数为所有diacrit返回一个RegExp:

function diacritsRegEx(global, caseinsitive, multiline){
        var modifiers =   (global       ? 'g' : '') 
                        + (multiline    ? 'm' : '')
                        + (caseinsitive ? 'i' : ''); 
        return new RegExp(
             ['[\\.\\-a-z\\s]|',            // [a-z, . - and space]
              '[\\300-\\306\\340-\\346]|',  // all accented A, a
              '[\\310-\\313\\350-\\353]|',  // all accented E, e
              '[\\314-\\317\\354-\\357]|',  // all accented I, i
              '[\\322-\\330\\362-\\370]|',  // all accented O, o
              '[\\331-\\334\\371-\\374]|',  // all accented U, u
              '[\\321-\\361]|',             // all accented N, n
              '[\\307-\\347]'               // all accented C, c
             ]
             .join(''), modifiers);
}

对于订单表单中的用户输入,我使用以下命令:[^\w\s+\/\uu1,.@-]
这允许电子邮件、邮政编码、名字、姓氏等使用字符。

我在运行时遇到这个错误:解析“^\w+*$”-嵌套的量词*@Dave,我确信他指的是
^\w+$
^\w*$
。这只是一个拼写错误。对不起,我有点像regex noob:我喜欢\w,但我如何有选择地添加一些标点符号呢?@Dave,在它后面写标点符号就行了。假设您需要一个单词,然后是一个句点:ECMAscript RegExp类不支持unicode,超出了\u。。。。转义以匹配单个代码点:[ECMA-262标准][1]。例如,
\w
转义仅包括ASCII字母和数字,加上“\u1”。[1] 当前位置我走错方向了吗?我想更广泛的问题是,服务器端防止XSS的最佳验证是什么(除了简单的HTML编码之外)?我将把服务器端函数分为一个只用于字母数字的函数和一个带有标点符号的函数。谢谢你的帮助!你可以在这里寻找它所接受的东西:也许可以根据你自己的需要改变。我的例子只涉及重音字母。您仍然需要执行A-z0-9