Проверить, содержит ли строка только буквы (a-z + é ü ö å ø ø и т. Д.) - PullRequest
27 голосов
/ 06 января 2010

Я хочу сопоставить строку, чтобы убедиться, что она содержит только буквы.

У меня есть это, и оно прекрасно работает:

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

НО

Поскольку я тоже говорю на другом языке, мне нужно разрешить все буквы, а не только A-Z. Также например:

é ü ö ê å ø

Кто-нибудь знает, существует ли глобальный термин 'alpha', который включает в себя все буквы для использования с regExp? Или даже лучше, у кого-нибудь есть какое-то решение?

Большое спасибо

EDIT: Просто понял, что вы также можете разрешить '-' и '' использовать двойное имя, например: 'Mary-Ann' или 'Mary Ann'

Ответы [ 12 ]

29 голосов
/ 06 января 2010

Я не знаю фактической причины для этого, но если вы хотите использовать его в качестве предварительной проверки, скажем, имен входа или псевдонимов пользователей, я бы предложил вам вводить символы самостоятельно используйте целые буквы «альфа», которые вы найдете в юникоде, потому что вы, вероятно, не найдете оптическую разницу в следующих буквах:

А ≠ A ≠ Α  # cyrillic, latin, greek

В таких случаях лучше указывать разрешенные буквы вручную, если вы хотите минимизировать подделку аккаунта и тому подобное.

Добавление

Ну, если бы это поле, которое должно быть неуникальным, я бы тоже разрешил греческий. Я не чувствую себя хорошо, когда заставляю пользователей менять свое имя на латинизированную версию.

Но для уникальных полей, таких как псевдонимы, нужно дать подсказку другим посетителям сайта, что это действительно псевдоним, который, как они думают, есть. Плохо, что люди уже подделывают аккаунты, меняя меня и меня. Конечно, это зависит от ваших пользователей; но, чтобы быть уверенным, я думаю, что лучше разрешить только основные латинские + диакритические знаки. (Может быть, посмотрите на этот список: Latin-производный_альп алфавит )

В качестве непроверенного предложения (с ‘-’, ‘_’ и ‘’):

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

Другое редактирование: Я добавил апостроф для людей с такими именами, как O'Neill или O'Reilly. (И прямой и обратный апостроф для людей, которые не могут правильно войти в кудрявый.)

13 голосов
/ 28 июня 2012
var onlyLetters = /^[a-zA-Z\u00C0-\u00ff]+$/.test(myString)
10 голосов
/ 06 января 2010

Вы не можете сделать это в 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 поддерживает аналогичные функции.

8 голосов
/ 12 июня 2013

Когда я пытался реализовать решение @ 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);
}
7 голосов
/ 06 января 2010

Это может быть сложно, к сожалению, JavaScript имеет довольно слабую поддержку интернационализации. Для этого вам нужно создать свой собственный класс персонажей. Это потому, что, например, \w - это то же самое, что и [0-9A-Z_a-z], что не очень вам поможет, и в Javascript нет ничего подобного [[:alpha:]]. Но так как кажется, что вы собираетесь использовать только один другой язык, вы, вероятно, можете просто добавить этих других персонажей в свой класс персонажей.

Кстати, я думаю, вам понадобится ? или * в вашем регулярном выражении, если myString может быть длиннее, чем один символ.

Полный пример,

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

6 голосов
/ 06 января 2010

Должно быть, но регулярное выражение будет зависеть от локализации. Таким образом, é ü ö ê å ø не будет фильтроваться, например, если вы находитесь в США. Чтобы убедиться, что ваш веб-сайт выполняет то, что вы хотите во всех локализациях, вы должны явно написать символы в форме, аналогичной той, что вы уже делаете.

Единственный стандартный, который мне известен, это \w, который соответствует всем буквенно-цифровым символам. Вы можете сделать это «стандартным» способом, запустив два регулярных выражения, одно для проверки совпадений \w, а другое для проверки того, что \d (все цифры) не совпадают, что приведет к гарантированной строке только для альфа. Опять же, я настоятельно призываю вас не использовать эту технику, поскольку нет никакой гарантии, что \w будет представлять в данной локализации, но это действительно отвечает на ваш вопрос.

5 голосов
/ 06 января 2010

Вы можете всегда использовать черный список вместо белого. Таким образом вы удаляете только те символы, которые вам не нужны.

5 голосов
/ 06 января 2010

Я ничего не знаю о Javascript, но если он имеет надлежащую поддержку юникода, преобразуйте вашу строку в разложенную форму, а затем удалите из нее диакритические знаки ([\u0300-\u036f\u1dc0-\u1dff]). Тогда ваши письма будут только ASCII.

3 голосов
/ 06 января 2010

Вы можете использовать черный список - список символов для исключения.

Кроме того, важно проверить ввод на стороне сервера, а не только на стороне клиента! Клиентская сторона может быть легко обойдена.

1 голос
/ 08 апреля 2013

Я использую конвертер перед проверкой, но он все еще не подходит для всех языков. Я не уверен, что это возможно.

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;

}
...