IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Controle champ input prénom composé [RegExp]


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Points : 61
    Points
    61
    Par défaut Controle champ input prénom composé
    Bonjour

    je cherche à contrôler la saisie dans un input avec :
    • une liste de caractères autorisés (cette partie fonctionne)
    • que le texte tapé sois modifié à la volée selon le format Xxxxx-Xxxxxx c'est la que je séche


    J'arrive bien à ce que le premier caractère soit en majuscule et que le reste soit en minuscule mais je n'arrive à mettre la majuscule après le tiret

    Si quelqu'un pouvez m'aider ?

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    	function verifprenom(chars) {
    		// Caractères autorisés
    		var regex = new RegExp(/[a-zA-Zàáâäçèéêëìíîïòóôöùúûü-]/, "i");
    		var valid;
    		for (var x = 0; x < chars.value.length; x++) {
    			valid = regex.test(chars.value.charAt(x));
    			if (valid === false) {
    				chars.value = chars.value.substr(0, x) + chars.value.substr(x + 1, chars.value.length - x + 1);
    				x--;
    			}
    		}
     
    		var regexMajuscule = new RegExp(/(^.|-.)/g);
    		chars.value = chars.value.replace(regexMajuscule, function (a) {
    			if (a.startsWith('-')) {
    				return '-' + a.charAt(1).toUpperCase() + a.substr(2).toLowerCase();
    			} else {
    				return a.charAt(0).toUpperCase() + a.slice(1).toLowerCase();
    			}
    		});
     
    		var regexFormat = new RegExp(/\S+(?:\s|$)/g);
    		chars.value = chars.value.replace(regexFormat, function (word) {
    			return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
    		});
    	}

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 112
    Points
    44 112
    Par défaut
    Bonjour,
    essaie avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function capitalize(str) {
      return str.replace(/(\b[a-z](?!\s))/g, function (c) {
        return c.toUpperCase();
      });
    }
    tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    console.log(capitalize("jean pierre"));
    console.log(capitalize("jean Pierre"));
    console.log(capitalize("Jean Pierre"));
    console.log(capitalize("Jean pierre"));
    console.log("--------------------");
    console.log(capitalize("jean-pierre"));
    console.log(capitalize("jean-Pierre"));
    console.log(capitalize("Jean-Pierre"));
    console.log(capitalize("Jean-pierre"));
    donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    > "Jean Pierre"
    > "Jean Pierre"
    > "Jean Pierre"
    > "Jean Pierre"
    > "--------------------"
    > "Jean-Pierre"
    > "Jean-Pierre"
    > "Jean-Pierre"
    > "Jean-Pierre"

  3. #3
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 413
    Points : 4 856
    Points
    4 856
    Par défaut
    Bonjour,

    NoSmoking je me demande s'ils existent des prénoms commançant par un accent, parce que si c'est le cas le regex proposé ne fonctionnera pas, mais avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    chars.value
    .replace(/^.|(?<=\s|\-)./gi,(letter,index,text)=>letter.toUpperCase())
    .replace(/(?<=[a-zàáâäçèéêëìíîïòóôöùúûü])./gi,letter=>letter.toLowerCase());
    La première partie pour la première lettre ou n'importe quel caractère précédé par un espace ou un tiret, et la deuxième pour n'importe quel caractère précédé par une lettre (au milieu d'un mot ou à sa fin), par exempe si on met éRiC ceci devient Éric

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Points : 61
    Points
    61
    Par défaut
    Bonjour

    Merci pour vos réponses, je n'ai malheureusement pas le temps de testé maintenant

    Mais effectivement si ça commence par une lettre avec accent le retour dans la console n'est pas bon, la majuscule est mise sur la second caractère

    éLise

    Apriori le \b ne fonctionne pas dans ce cas

  5. #5
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 413
    Points : 4 856
    Points
    4 856
    Par défaut
    Bonjour,

    Oui, dans la doc des expression rationnelles on voit bien la note concernant le \b.

    Note : Le moteur d'expressions rationnelles JavaScript définit un ensemble de caractères spécifiques qui doivent être considérés comme des caractères de mot. Tout caractère qui n'est pas dans cet ensemble est considéré comme une limite de mot. Cet ensemble de caractères est relativement limité car constitué uniquement des caractères de l'alphabet romain en minuscules et en majuscules, des chiffres décimaux et du tiret-bas (underscore). Les autres caractères, comme les caractères accentués (é ou ü par exemple), sont donc considérés comme des limites de mots.

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Modifier la zone de saisie (un input ou textarea) à chaque frappe risque de surprendre l'utilisateur. À ta place je déclencherais mes tests et mises en forme à la perte du focus. Ou si tu tiens à l'effet "magique", tu peux aussi afficher le contenu mis en forme à coté.

    À propos des lettres accentuées:
    • difficile de faire une liste exhaustive et pertinente de lettres autorisées en particulier pour les noms propres qui peuvent contenir des accents inhabituels, comme le caron des prénoms d'origine Croate Dražen et Dražana. À mon avis mieux vaut être lâche et utiliser la classe \p{sc=Latin} ou faire des rangs de caractères.
    • autre difficulté, avec unicode on peut composer une lettre accentuée de deux manières:
      • lorsque la lettre accentuée existe en tant que telle dans la table unicode, dans ce cas on peut la composer avec son seul point de code.
      • on peut aussi la composer en utilisant le point de code de la lettre non-accentuée et le point de code de l'accent combinant. La classe \p{M}
      contient ces caractères combinants, mais tu peux aussi faire ton marché dans le block de U+0300 à U+036F.
      Par exemple un "à" peut-être le point de code U+00E0 (LATIN SMALL LETTER A WITH GRAVE) ou bien la succession des points de code U+0061 (LATIN SMALL LETTER A) et U+0300 (COMBINING GRAVE ACCENT).
    • le word boundary \b qui pourtant serait bien utile pour capitaliser la première lettre ne marche pas avec les lettres accentuées (en un seul point de code), car contrairement à d'autres moteurs de regex, le modificateur u n'étend pas la classe \w aux lettres et chiffres en dehors de la plage ASCII. Concrètement tu ne pourras matcher le "é" de "élise" avec /\bé/.


    Bref, rien de vaut un pèlerinage ici et ici pour avoir un aperçu des caractères Latin et des caractères combinants. Regarde aussi la doc mdn sur les classes de caractères Unicode (les versions anglaise et française sont différentes, regarde les deux), ainsi que les possibilités d'opérations dans les classes de caractères (intersection, soustraction) qu'offre le modificateur v.

    Pour ce qui est mettre en majuscule la première lettre de chaque mot (et le reste en minuscule je suppose), je ferais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    text = text.replace(/(\p{L})([\p{L}\p{M}]*)/gu, (_, g1, g2) => g1.toUpperCase() + g2.toLowerCase())
    Comme la chaîne est lue de gauche à droite et que toutes les lettres consécutives (avec leur éventuels accents combinants) sont consommées par la pattern, pas besoin de word boundary \b, la pattern capturera toujours la première lettre d'un mot dans son groupe 1.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 413
    Points : 4 856
    Points
    4 856
    Par défaut
    CosmoKnacki le chef des expressions regulières

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 112
    Points
    44 112
    Par défaut
    Pour info j'utilisais cette fonction pour palier à un manque de IE11 concernant la prise en compte de text-transform: capitalize, donc devenue parfaitement inutile.
    Citation Envoyé par Toufik83
    NoSmoking je me demande s'ils existent des prénoms commançant par un accent,
    Bien sûr, mais ceux que je connais écrivent Eric et non Éric, Elisabeth et non Élisabeth, la France boude les accents sur les majuscules !

    Citation Envoyé par CosmoKnacki
    Modifier la zone de saisie (un input ou textarea) à chaque frappe risque de surprendre l'utilisateur.
    Je n'ai de cesse de le dire, surtout ne pas surprendre/dérouter l'utilisateur.

    Bon ceci étant, je me doutais bien que CosmoKnacki passerait pour nous donner/expliquer une solution aux petits oignons .

  9. #9
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Merci pour votre enthousiasme! Mais quand je vois l'évolution des regex en Javascript et le pavé de la documentation unicode, je me dis que j'ai encore du boulot.

    Citation Envoyé par NoSmoking Voir le message
    la France boude les accents sur les majuscules !
    C'est vrai que c'est courant et beaucoup croient qu'on ne met pas d'accents sur les majuscules, ce qui est une erreur. Moi le premier, et c'est en lisant un tutoriel sur les bases de données ou sur la typographie (je ne sais plus) que je l'ai découvert (bien tardivement d'ailleurs).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Points : 61
    Points
    61
    Par défaut
    Merci à tous et merci CosmoKnacki ca fonctionne impec.

    Le formulaire est pas fait pour du grand public, mais pour des techs info, ça ne les surprends pas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Control à la sortie d'un champ input
    Par degio1er dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/02/2013, 10h39
  2. Controle champ input
    Par lelectronique.com dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/04/2010, 15h44
  3. IE pour controle champ obligatoire de genre input text
    Par lolymeupy dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 30/05/2008, 15h28
  4. contrôle sur plusieurs champs Input
    Par paolo2002 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/03/2008, 12h33
  5. Problème de contrôle de champ input texte
    Par NATHW dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/10/2004, 22h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo