web-dev-qa-db-fra.com

Teste si la chaîne de caractères ne contient que des lettres (a-z + é

Je veux faire correspondre une chaîne pour m'assurer qu'elle ne contient que des lettres.

J'ai ça et ça marche très bien:

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

MAIS

Comme je parle aussi une autre langue, je dois autoriser toutes les lettres, pas seulement les AZ. Aussi par exemple:

é ü ö ê å ø

est-ce que quelqu'un sait s'il existe un terme global 'alpha' qui inclut toutes les lettres à utiliser avec regExp? Ou mieux encore, est-ce que quelqu'un a une solution?

Merci beaucoup

EDIT: Je viens de me rendre compte que vous pourriez aussi vouloir permettre les '-' et '' en cas de double nom comme 'Mary-Ann' ou 'Mary Ann'

27
patad

Je ne connais pas la raison réelle de cela, mais si vous voulez l'utiliser comme pré-vérification pour, par exemple, les noms de connexion ou les surnoms d'utilisateurs, je vous suggère de saisir les caractères vous-même et de ne pas utiliser le tout. Les caractères 'alpha' que vous trouverez en unicode, car vous ne trouverez probablement pas de différence optique dans les lettres suivantes:

А ≠ A ≠ Α  # cyrillic, latin, greek

Dans de tels cas, il est préférable de spécifier manuellement les lettres autorisées si vous souhaitez minimiser les faux comptes, etc.

Une addition

Eh bien, s’il s’agit d’un champ censé être non unique, j’autoriserais également le grec. Je ne me sentirais pas bien quand je forcerais les utilisateurs à changer leur nom en une version latinisée.

Toutefois, pour les champs uniques tels que les pseudonymes, vous devez indiquer aux autres visiteurs du site qu’il s’agit bien du pseudonyme qu’ils pensent. Assez mauvais pour que les gens fassent de faux comptes en échangeant déjà I et I. Bien sûr, cela dépend de vos utilisateurs. mais pour être sûr, je pense qu’il est préférable d’autoriser uniquement les caractères latins + diacritiques de base. (Peut-être jetez un coup d'œil à cette liste: Latin-dérivé_alphabet )

En tant que suggestion non testée (avec “-”, “_” et “”):

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

Une autre édition: J'ai ajouté l'apostrophe pour les personnes portant des noms comme O’Neill ou O’Reilly. (Et l’apostrophe droite et inversée pour les personnes qui ne peuvent pas entrer correctement dans la version bouclée.)

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

Vous ne pouvez pas faire cela dans JS. Il a un support très limité de regex et de normalisateur. Vous auriez besoin de construire un tableau de caractères long et incontrôlable avec tous caractères latins possibles avec des signes diacritiques (je suppose qu'il y en a environ 500 différents). Déléguez plutôt la tâche de validation du côté serveur, qui utilise une autre langue avec davantage de capacités d'expression régulière, si nécessaire avec l'aide de ajax.

Dans un environnement regex à part entière, vous pouvez simplement tester si la chaîne correspond à \p{L}+. Voici un exemple Java :

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

Vous pouvez également normaliser le texte pour vous débarrasser des signes diacritiques et vérifier s'il contient uniquement [A-Za-z]+. Voici à nouveau un exemple Java :

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

PHP supporte des fonctions similaires.

10
BalusC

Lorsque j'ai essayé d'implémenter la solution de @ Debilski, JavaScript n'appréciait pas les caractères latins étendus - je devais les coder comme JavaScript s'échappe:

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

Il devrait y en avoir, mais la regex dépendra de la localisation. Ainsi, é ü ö ê å ø ne sera pas filtré si vous vous trouvez sur une localisation US, par exemple. Pour vous assurer que votre site Web fait ce que vous voulez dans toutes les localisations, vous devez explicitement écrire les caractères sous une forme similaire à celle que vous êtes déjà en train de faire.

Le seul standard que je connaisse cependant est \w, qui correspond à tous les caractères alphanumériques. Vous pouvez le faire de manière "standard" en exécutant deux expressions rationnelles, une pour vérifier les correspondances \w et une autre pour vérifier que \d (tous les chiffres) ne correspond pas, ce qui donnerait une chaîne alpha-only garantie. Encore une fois, je vous encourage vivement à ne pas utiliser cette technique car rien ne garantit ce que \w représentera dans une localisation donnée, mais cela répond à votre question.

6
David Pfeffer

Je ne connais rien au Javascript, mais s'il dispose du support unicode approprié, convertissez votre chaîne en une forme décomposée, puis supprimez les signes diacritiques ([\u0300-\u036f\u1dc0-\u1dff]). Ensuite, vos lettres ne seront que ASCII.

5
Virgil Dupras

Vous pouvez toujours utiliser une liste noire au lieu d'une liste blanche. De cette façon, vous ne supprimez que les caractères dont vous n'avez pas besoin.

5
Hazior

Vous pouvez utiliser une liste noire - une liste de caractères à exclure.

En outre, il est important de vérifier les entrées côté serveur, pas seulement côté client! Côté client peut être facilement contourné.

3
Frunsi

J'utilise un convertisseur avant de vérifier, mais ce n'est pas encore amical pour toutes les langues ... Je ne suis pas sûr que ce soit possible.

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;

}
1
Joeri

Il existe quelques raccourcis pour y parvenir dans d'autres dialectes d'expression régulière - voir cette page . Mais je ne pense pas qu’il existe des scripts standardisés en JavaScript - ce n’est certainement pas le cas de tous les navigateurs.

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