Подтвердить что ты не робот

Проверьте, содержит ли строка только буквы (a-z + é ü ö ê å ø и т.д.)

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

У меня есть это, и все работает отлично:

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

НО

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

é ü ö ê å ø

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

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

EDIT: Просто понял, что вы также можете позволить "-" и "включить двойное имя, например:" Мэри-Энн "или" Мэри Энн "

4b9b3361

Ответ 1

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

А ≠ A ≠ Α  # cyrillic, latin, greek

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

Добавление

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

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

Как непроверенное предложение (с '-,' _ и '):

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

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

Ответ 2

var onlyLetters = /^[a-zA-Z\u00C0-\u00ff]+$/.test(myString)

Ответ 3

Вы не можете сделать это в JS. Он имеет очень ограниченную поддержку регулярных выражений и нормализаторов. Вам понадобится построить длинный и недостижимый массив символов с всеми возможными латинскими символами с диакритическими метками (я думаю, их около 500 разных). Скорее делегируйте задачу проверки на серверную сторону, которая использует другой язык с дополнительными возможностями regex, при необходимости с помощью 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 поддерживает аналогичные функции.

Ответ 4

Когда я попытался реализовать решение @Debilski, JavaScript не понравился расширенным латинским символам - мне пришлось их кодировать как escape-код 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);
}

Ответ 5

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

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

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

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;

}

Ответ 12

var regexp = /\B\#[a-zA-Z\x7f-\xff]+/g; 
var result = searchText.match(regexp);