Pergunta

Eu quero encontrar uma string para se certificar de que ele contém apenas letras.

Eu tenho isso e ele funciona muito bem:

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

MAS

Desde que eu falar outra língua também, eu preciso para permitir que todas as letras, não apenas A-Z. Também por exemplo:

é ü ö ê å ø

Alguém sabe se existe um termo 'alpha' global que inclui todas as letras para usar com regexp? Ou melhor ainda, alguém tem algum tipo de solução?

Muito obrigado

EDIT: Só percebi que você pode também querer permitir '-' e '', no caso de um nome duplo como: 'Mary-Ann' ou 'Mary Ann'

Foi útil?

Solução

Eu não sei o motivo real para fazer isso, mas se você quiser usá-lo como uma pré-seleção para, digamos, nomes de login oder apelidos de usuários, eu sugiro que você digitar os caracteres si mesmo e não fazer usar os caracteres inteiros 'alpha' que você encontrará em unicode, porque você provavelmente não vai encontrar uma diferença de óptica nas seguintes letras:

А ≠ A ≠ Α  # cyrillic, latin, greek

Em tais casos, é melhor para especificar as letras permitidos manualmente, se você quiser minimizar conta falsificação e tal.

Adição

Bem, se é para um campo que é suposto ser não-exclusivo, eu permitiria grego também. Eu não me sentiria bem quando eu forçar os usuários a mudar seu nome para uma versão latinizada.

Mas para campos exclusivos como apelidos que você precisa para dar aos seus outros visitantes do site uma dica, que é realmente o apelido eles pensam que é. Bad o suficiente para que as pessoas vão contas falsas com intercâmbio I e L já. Claro, isso é algo que depende de seus usuários; mas para ter certeza que eu acho que é melhor para permitir que apenas diacríticos básicos + latinos. (Talvez ter um olhar para esta lista: latino-derived_alphabet )

Como uma sugestão não foi testado (com ‘-’, ‘_’ e ‘’):

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

Outro edit: Eu adicionei o apóstrofo para pessoas com nomes como O'Neill ou O'Reilly. (E o reto e o apóstrofo invertida para as pessoas que não podem entrar na um encaracolado corretamente.)

Outras dicas

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

Você não pode fazer isso em JS. Tem um apoio regex e normalizador muito limitado. Você precisaria construir um array de caracteres longa e insustentável com todas possíveis caracteres latinos com sinais diacríticos (eu acho que existem cerca de 500 diferentes). Em vez delegar a tarefa de validação para o lado do servidor que usa outra língua com capabilties mais regex, se necessário com a ajuda de ajax.

Em um ambiente regex pleno direito você pode simplesmente testar se a string corresponde \p{L}+. Aqui está um Java exemplo :

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

Como alternativa, você também pode normailze o texto para se livrar dos sinais diacríticos e verificar se ele contém apenas [A-Za-z]+. Aqui está mais uma vez um Java exemplo :

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

PHP suporta funções semelhantes.

Quando eu tentei implementar @ solução de Debilski JavaScript não como os caracteres latinos estendidos - Eu tinha de código-los como JavaScript escapa:

// 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);
}

Isto pode ser complicado, infelizmente JavaScript tem muito pobre apoio à internacionalização. Para fazer esta verificação você terá que criar sua própria classe de personagem. Isto é porque, por exemplo, \w é o mesmo que [0-9A-Z_a-z] que não vai ajudá-lo muito e não há nada como [[:alpha:]] em Javascript. Mas, uma vez que parece que você está indo só para usar um outro langauge você pode provavelmente apenas adicionar os outros personagens em sua classe de personagem.

A propósito, acho que você vai precisar de uma ? ou * em sua regexp lá se myString pode ter mais de um caractere.

O exemplo completo,

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

Não deve haver, mas o regex será localização dependente. Assim, é ü ö ê å ø não serão filtrados se você estiver em uma localização para os EUA, por exemplo. Para garantir o seu web site faz o que quiser em todas as localizações, você deve explicitamente escrever os caracteres de uma forma semelhante ao que você já está fazendo.

O único padrão que eu estou ciente de que é \w, que seria compatível com todos os caracteres alfanuméricos. Você poderia fazê-lo da maneira "padrão", executando dois regex, um para verificar partidas \w e outro para verificar se \d (todos os dígitos) não corresponde, o que resultaria em uma cadeia apenas de alfa garantida. Mais uma vez, eu recomendo vivamente que você não usar esta técnica como não há nenhuma garantia que \w representará em uma determinada localização, mas isso não responder à sua pergunta.

Eu não sei nada sobre Javascript, mas se ele tem suporte a Unicode adequada, converter a cadeia para uma forma decomposta, em seguida, remover os sinais diacríticos a partir dele ([\u0300-\u036f\u1dc0-\u1dff]). Em seguida, as cartas só serão aqueles ASCII.

Você sempre pode usar uma lista negra em vez de uma lista branca. Dessa forma, você só remover os caracteres que você não precisa.

Você pode usar uma lista negra -. Uma lista de caracteres para excluir

Além disso, é importante verificar a entrada no lado do servidor, não só no lado do cliente! Do lado do cliente pode ser contornado facilmente.

Existem alguns atalhos para obter este em outros dialetos de expressão regular - veja esta página . Mas eu não acredito que há qualquer queridos padronizados em JavaScript -. Certamente não que seria suportado por todos os navegadores

Eu estou usando um conversor antes de verificar, mas ainda não é amigável para todos os idiomas. Eu não tenho certeza que isso é possível.

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top