33

我想匹配一个字符串以确保它只包含字母。

我有这个,它工作得很好:

var onlyLetters = /^[a-zA-Z]*$/.test(myString);

因为我也说另一种语言,所以我需要允许所有字母,而不仅仅是 AZ。还例如:

é ü ö ê å ø

有谁知道是否有一个全局'alpha'术语包含所有与 regExp 一起使用的字母?或者更好的是,有人有某种解决方案吗?

非常感谢

编辑: 刚刚意识到您可能还想允许 '-' 和 ' ' 以防出现双重名称,例如:'Mary-Ann' 或 'Mary Ann'

4

12 回答 12

34

我不知道这样做的实际原因,但如果你想用它来预先检查,比如登录名或用户昵称,我建议你自己输入字符,不要使用整个您会在 unicode 中找到“alpha”字符,因为您可能不会在以下字母中发现视觉差异:

А ≠ A ≠ Α  # cyrillic, latin, greek

在这种情况下,如果您想最大程度地减少帐户伪造等,最好手动指定允许的字母。

添加

好吧,如果它用于一个应该是非唯一的字段,我也会允许使用希腊语。当我强迫用户将他们的名字改为拉丁化版本时,我会感觉不舒服。

但是对于像昵称这样的独特字段,您需要给网站的其他访问者一个提示,这确实是他们认为的昵称。糟糕的是,人们已经通过交换 I 和 l 来伪造帐户。当然,这取决于您的用户;但可以肯定的是,我认为最好只允许基本的拉丁语+变音符号。(也许看看这个列表:Latin-derived_alphabet

作为未经测试的建议(带有'-'、'_'和''):

/^[a-zA-Z\-_ ’'‘ÆÐƎƏƐƔIJŊŒẞÞǷȜæðǝəɛɣijŋœĸſßþƿȝĄƁÇĐƊĘĦĮƘŁØƠŞȘŢȚŦŲƯY̨Ƴąɓçđɗęħįƙłøơşșţțŧųưy̨ƴÁÀÂÄǍĂĀÃÅǺĄÆǼǢƁĆĊĈČÇĎḌĐƊÐÉÈĖÊËĚĔĒĘẸƎƏƐĠĜǦĞĢƔáàâäǎăāãåǻąæǽǣɓćċĉčçďḍđɗðéèėêëěĕēęẹǝəɛġĝǧğģɣĤḤĦIÍÌİÎÏǏĬĪĨĮỊIJĴĶƘĹĻŁĽĿʼNŃN̈ŇÑŅŊÓÒÔÖǑŎŌÕŐỌØǾƠŒĥḥħıíìiîïǐĭīĩįịijĵķƙĸĺļłľŀʼnńn̈ňñņŋóòôöǒŏōõőọøǿơœŔŘŖŚŜŠŞȘṢẞŤŢṬŦÞÚÙÛÜǓŬŪŨŰŮŲỤƯẂẀŴẄǷÝỲŶŸȲỸƳŹŻŽẒŕřŗſśŝšşșṣßťţṭŧþúùûüǔŭūũűůųụưẃẁŵẅƿýỳŷÿȳỹƴźżžẓ]$/.test(myString)

另一个编辑: 我为 O'Neill 或 O'Reilly 等名字的人添加了撇号。(对于那些不能正确输入卷曲的人来说,直撇号和反撇号。)

于 2010-01-06T14:27:57.073 回答
16
var onlyLetters = /^[a-zA-Z\u00C0-\u00ff]+$/.test(myString)
于 2012-06-27T20:06:00.113 回答
11

你不能在 JS 中做到这一点。它具有非常有限的正则表达式和规范化器支持。您需要构建一个冗长且不可维护的字符数组,其中包含所有可能的带有变音符号的拉丁字符(我猜大约有 500 个不同的字符)。而是将验证任务委托给使用另一种具有更多正则表达式功能的语言的服务器端,如有必要,在 ajax 的帮助下。

在完整的正则表达式环境中,您可以测试字符串是否匹配\p{L}+。这是一个Java 示例

boolean valid = string.matches("\\p{L}+");

或者,您也可以对文本进行规范化以去除变音符号并检查它是否[A-Za-z]+仅包含。这又是一个Java 示例

string = Normalizer.normalize(string, Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
boolean valid = string.matches("[A-Za-z]+");

PHP 支持类似的功能。

于 2010-01-06T14:38:35.227 回答
9

当我尝试实现@Debilski 的解决方案时,JavaScript 不喜欢扩展的拉丁字符——我不得不将它们编码为 JavaScript 转义:

// The huge unicode escape string is equal to ÆÐƎƏƐƔIJŊŒẞÞǷȜæðǝəɛɣijŋœĸſßþƿȝĄƁÇĐƊĘĦ
// ĮƘŁØƠŞȘŢȚŦŲƯY̨Ƴąɓçđɗęħįƙłøơşșţțŧųưy̨ƴÁÀÂÄǍĂĀÃÅǺĄÆǼǢƁĆĊĈČÇĎḌĐƊÐÉÈĖÊËĚĔĒĘẸƎ
// ƏƐĠĜǦĞĢƔáàâäǎăāãåǻąæǽǣɓćċĉčçďḍđɗðéèėêëěĕēęẹǝəɛġĝǧğģɣĤḤĦIÍÌİÎÏǏĬĪĨĮỊ
// IJĴĶƘĹĻŁĽĿʼNŃN̈ŇÑŅŊÓÒÔÖǑŎŌÕŐỌØǾƠŒĥḥħıíìiîïǐĭīĩįịijĵķƙĸĺļłľŀʼnńn̈ňñ
// ņŋóòôöǒŏōõőọøǿơœŔŘŖŚŜŠŞȘṢẞŤŢṬŦÞÚÙÛÜǓŬŪŨŰŮŲỤƯẂẀŴẄǷÝỲŶŸȲỸƳŹŻŽẒŕřŗſśŝšşșṣßťţṭ
// ŧþúùûüǔŭūũűůųụưẃẁŵẅƿýỳŷÿȳỹƴźżžẓ

function isAlpha(string) {
    var patt = /^[a-zA-Z\u00C6\u00D0\u018E\u018F\u0190\u0194\u0132\u014A\u0152\u1E9E\u00DE\u01F7\u021C\u00E6\u00F0\u01DD\u0259\u025B\u0263\u0133\u014B\u0153\u0138\u017F\u00DF\u00FE\u01BF\u021D\u0104\u0181\u00C7\u0110\u018A\u0118\u0126\u012E\u0198\u0141\u00D8\u01A0\u015E\u0218\u0162\u021A\u0166\u0172\u01AFY\u0328\u01B3\u0105\u0253\u00E7\u0111\u0257\u0119\u0127\u012F\u0199\u0142\u00F8\u01A1\u015F\u0219\u0163\u021B\u0167\u0173\u01B0y\u0328\u01B4\u00C1\u00C0\u00C2\u00C4\u01CD\u0102\u0100\u00C3\u00C5\u01FA\u0104\u00C6\u01FC\u01E2\u0181\u0106\u010A\u0108\u010C\u00C7\u010E\u1E0C\u0110\u018A\u00D0\u00C9\u00C8\u0116\u00CA\u00CB\u011A\u0114\u0112\u0118\u1EB8\u018E\u018F\u0190\u0120\u011C\u01E6\u011E\u0122\u0194\u00E1\u00E0\u00E2\u00E4\u01CE\u0103\u0101\u00E3\u00E5\u01FB\u0105\u00E6\u01FD\u01E3\u0253\u0107\u010B\u0109\u010D\u00E7\u010F\u1E0D\u0111\u0257\u00F0\u00E9\u00E8\u0117\u00EA\u00EB\u011B\u0115\u0113\u0119\u1EB9\u01DD\u0259\u025B\u0121\u011D\u01E7\u011F\u0123\u0263\u0124\u1E24\u0126I\u00CD\u00CC\u0130\u00CE\u00CF\u01CF\u012C\u012A\u0128\u012E\u1ECA\u0132\u0134\u0136\u0198\u0139\u013B\u0141\u013D\u013F\u02BCN\u0143N\u0308\u0147\u00D1\u0145\u014A\u00D3\u00D2\u00D4\u00D6\u01D1\u014E\u014C\u00D5\u0150\u1ECC\u00D8\u01FE\u01A0\u0152\u0125\u1E25\u0127\u0131\u00ED\u00ECi\u00EE\u00EF\u01D0\u012D\u012B\u0129\u012F\u1ECB\u0133\u0135\u0137\u0199\u0138\u013A\u013C\u0142\u013E\u0140\u0149\u0144n\u0308\u0148\u00F1\u0146\u014B\u00F3\u00F2\u00F4\u00F6\u01D2\u014F\u014D\u00F5\u0151\u1ECD\u00F8\u01FF\u01A1\u0153\u0154\u0158\u0156\u015A\u015C\u0160\u015E\u0218\u1E62\u1E9E\u0164\u0162\u1E6C\u0166\u00DE\u00DA\u00D9\u00DB\u00DC\u01D3\u016C\u016A\u0168\u0170\u016E\u0172\u1EE4\u01AF\u1E82\u1E80\u0174\u1E84\u01F7\u00DD\u1EF2\u0176\u0178\u0232\u1EF8\u01B3\u0179\u017B\u017D\u1E92\u0155\u0159\u0157\u017F\u015B\u015D\u0161\u015F\u0219\u1E63\u00DF\u0165\u0163\u1E6D\u0167\u00FE\u00FA\u00F9\u00FB\u00FC\u01D4\u016D\u016B\u0169\u0171\u016F\u0173\u1EE5\u01B0\u1E83\u1E81\u0175\u1E85\u01BF\u00FD\u1EF3\u0177\u00FF\u0233\u1EF9\u01B4\u017A\u017C\u017E\u1E93]+$/;
    return patt.test(string);
}
于 2013-06-12T01:12:25.363 回答
8

这可能很棘手,不幸的是 JavaScript 对国际化的支持很差。要执行此检查,您必须创建自己的角色类。这是因为例如,与which 对您没有太大帮助\w的相同,并且在 Javascript 中没有任何类似的东西。但是,由于听起来您只会使用另一种语言,因此您可能只需将这些其他字符添加到您的字符类中即可。[0-9A-Z_a-z][[:alpha:]]

顺便说一句,如果 myString 可以长于一个字符,我认为您将需要一个?or在您的正则表达式中。*

完整的例子,

/^[a-zA-Zéüöêåø]*$/.test(myString);

于 2010-01-06T14:37:05.013 回答
7

应该有,但正则表达式将取决于本地化。因此,é ü ö ê å ø例如,如果您在美国本地化,则不会被过滤。为确保您的网站在所有本地化中都符合您的要求,您应该以类似于您已经在做的形式明确地写出字符。

我知道的唯一标准是\w,它将匹配所有字母数字字符。您可以通过运行两个正则表达式以“标准”方式执行此操作,一个用于验证\w匹配,另一个用于验证\d(所有数字)不匹配,这将导致保证只有 alpha 字符串。再次,我强烈敦促您不要使用这种技术,因为无法保证\w在给定的本地化中代表什么,但这确实回答了您的问题。

于 2010-01-06T14:15:46.600 回答
6

我对 Javascript 一无所知,但如果它具有适当的 unicode 支持,请将您的字符串转换为分解的形式,然后从中删除变音符号 ( [\u0300-\u036f\u1dc0-\u1dff])。那么你的字母只会是 ASCII 字母。

于 2010-01-06T14:16:05.320 回答
6

您可以使用黑名单而不是白名单。这样你只删除你不需要的字符。

于 2010-01-06T14:26:13.557 回答
4

您可以使用黑名单 - 要排除的字符列表。

此外,在服务器端验证输入也很重要,而不仅仅是在客户端!客户端可以轻松绕过。

于 2010-01-06T14:42:59.713 回答
2

在其他正则表达式方言中,有一些快捷方式可以实现这一点 - 请参阅此页面。但我不相信 JavaScript 中有任何标准化的——当然不是所有浏览器都支持的。

于 2010-01-06T14:15:40.873 回答
2

我在检查之前使用了转换器,但它对所有语言仍然不友好。我不确定这是否可能。

function noExtendedChars( input_name ){

    var whitelist = [
        ['a',  'à','á','â','ä','æ','ã','å','ā'],
        ['c',  'ç', 'ć', 'č'],
        ['e',  'è','é','ê','ë','ē','ė','ę'],
        ['i',  'ï','ï','í','ī','į','î'],
        ['l',  'ł'],
        ['n',  'ñ', 'ń'],
        ['o',  'ô', 'ö', 'ò', 'ó', 'œ', 'ø', 'ō', 'õ' ],
        ['s',  'ß', 'ś', 'š' ],
        ['u',  'û', 'ü', 'ù', 'ú', 'ū'],
        ['y',  'ÿ'],
        ['z',  'ž', 'ź', 'ż']
        ];

    for( b=0; b < blacklist.length; b++ ){
        var r=  blacklist[b];
        for ( a=1; a < r.length; a++ ){
            input_name = input_name.replace( new RegExp( r[a], "gi") , r[0]);
        }
    }
    return input_name;

}
于 2013-04-08T13:10:00.667 回答
2
var regexp = /\B\#[a-zA-Z\x7f-\xff]+/g; 
var result = searchText.match(regexp);
于 2017-07-13T11:40:41.573 回答