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

StackOverflow https://stackoverflow.com/questions/2013451

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

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

НО

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

é ü ö ê å ø

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

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

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

Это было полезно?

Решение

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

А ≠ A ≠ Α  # cyrillic, latin, greek

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

Дополнение

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

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

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

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

Еще одна правка: Я добавил апостроф для людей с такими именами, как О'Нил или О'Рейли.(А также прямой и перевернутый апостроф для людей, которые не могут правильно ввести фигурный.)

Другие советы

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

Вы не можете сделать это в JS.Он имеет очень ограниченную поддержку регулярных выражений и нормализаторов.Вам нужно было бы создать длинный и не поддерживаемый массив символов с ВСЕ возможные латинские символы с диакритическими знаками (я думаю, существует около 500 различных символов).Скорее делегируйте задачу проверки стороне сервера, которая использует другой язык с большими возможностями регулярных выражений, при необходимости с помощью ajax.

В полноценной среде регулярных выражений вы могли бы просто проверить, совпадает ли строка \p{L}+.Вот такой Пример Java:

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

В качестве альтернативы вы также можете нормализовать текст, чтобы избавиться от диакритических знаков и проверить, содержит ли он [A-Za-z]+ Только.Вот опять a Пример Java:

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

PHP поддерживает аналогичные функции.

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

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

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

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

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

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

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

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

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

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

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

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

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

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;

}
var regexp = /\B\#[a-zA-Z\x7f-\xff]+/g; 
var result = searchText.match(regexp);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top