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

本文关键字:不区 名单 验证 输入 Regex 白名单 用于 | 更新日期: 2023-09-27 17:50:06

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

^[a-zA-Z0-9èéêëàáâãäçìíîïòóôõöùúûü-_]*$

它允许大多数法语口音,但拉丁字符集中的口音列表是巨大的!我更喜欢使用白名单而不是黑名单,以防我遗漏了什么。

注意,这将是c#,但我想使用正则表达式的客户端验证是一致的双方。我是HTML编码的输入,当我保存到数据库以及。

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

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

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

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

fwiw:我使用一个自制函数返回所有字符的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+$

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

在一些正则表达式实现中,一个简单的'w将涵盖所有这些。见http://www.regular-expressions.info/charclass.html

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

^['w_-]+$

,其中'w代表任意字母,_-是允许的两个额外标点符号。

对于用户输入的订单形式,我使用这个:[^'w's+'/_,.@-]这允许字符输入电子邮件、邮政编码、名字、姓氏等。