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

Langage PHP Discussion :

Mettre en majuscule la première lettre d'une chaine [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Mettre en majuscule la première lettre d'une chaine
    Bonjour,

    Je souhaiterais, comme le nom l'indique, respecter un formatage de saisie de sorte à ce qu'on est :
    'prénom : Jean Edouard'.

    Avoir donc un prénom qui a pour première lettre de chaque mot une majuscule.

    Jusqu'à içi tout va bien cependant je tolère les chaines de caractères disposant de guillemets et d'apostrophe en début de chaines.

    Du coup pour une chaine comme : 'éÉ'é-É'bé'
    On a : 'Eé'E-E'Bé'

    J'ai écris cette fonction :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    function first_char_MAJ($arg)
    {
      //$new = utf8_decode($arg);
      $new = $arg;
      $new = str_split($new);
      $first_char=false;
      $indice_new=0;
        do{
          if(preg_match('#[a-zA-Z]#', $new[$indice_new]))
          {
            $new[$indice_new] = strtoupper($new[$indice_new]);
            $first_char=true;
          }
     
          if(preg_match('#à#', $new[$indice_new]))
          {
            preg_replace('#à#','A', $new[$indice_new]);
            $first_char=true;
          }
          if(preg_match('#â#', $new[$indice_new]))
          {
            preg_replace('#â#','A', $new[$indice_new]);
            $first_char=true;
          }
          if(preg_match('#ç#', $new[$indice_new]))
          {
            preg_replace('#ç#','C', $new[$indice_new]);
            $first_char=true;
          }
          if(preg_match('#è#', $new[$indice_new]))
          {
            echo'HEREEEEEEEEEE !';
            preg_replace('#è#','E', $new[$indice_new]);
            $first_char=true;
          }
          if(preg_match('#ê#', $new[$indice_new]))
          {
            echo'HEREEEEEEEEEE !';
            preg_replace('#ê#','E', $new[$indice_new]);
            $first_char=true;
          }
          if(preg_match('#é#', $new[$indice_new]))
          {
            echo'HEREEEEEEEEEE !';
            preg_replace('#é#','E', $new[$indice_new]);
            $first_char=true;
          }
          if(preg_match('#ë#', $new[$indice_new]))
          {
            echo'HEREEEEEEEEEE !';
            preg_replace('#ë#','E', $new[$indice_new]);
            $first_char=true;
          }
          if(preg_match('#ï#', $new[$indice_new]))
          {
            preg_replace('#ï#','I', $new[$indice_new]);
            $first_char=true;
          }
          if(preg_match('#î#', $new[$indice_new]))
          {
            preg_replace('#î#','I', $new[$indice_new]);
            $first_char=true;
          }
          if($indice_new == count($new)-1)
            $first_char=true;
     
          $indice_new++;
        } while ($first_char == false);
     
      $new = implode($new);
      // $new=utf8_encode($new);
      return $new;
    }
    Celle-ci fonction pour les lettres standard (a-z) mais dès que celles-ci ont des accents je rencontre un problème d'encodage.
    Je ne vois pas du tout comment faire pour contrer ce problème si quelqu'un à une solution je suis preneur.

    Merci d'avance

  2. #2
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Tu veux garder les lettres majuscules accentuées ou pas ?
    Dans ton exemple tu les enlèves ??

    Avec lettres majuscules accentuées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $str = "'éÉ'é-É'bé'";
     
    echo 
        implode(
            "'", 
            array_map(
                function($s){ return mb_convert_case($s, MB_CASE_TITLE); }, 
                explode("'", $str)
            )
        )
    ;
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu peux regarder la fonction ucwords ou si tu as des problèmes d'encodage (ce qui est probablement le cas si tu gères les majuscules accentuées) mb_​convert_​case avec le flag MB_CASE_TITLE.

    Toutefois, je ne suis pas sûre du comportement pour les prénoms composés avec des tirets ou des apostrophes.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Tu veux garder les lettres majuscules accentuées ou pas ?
    Dans ton exemple tu les enlèves ??
    J'enlève une fois passé en majuscules, j'ai une méthode qui me permet de le faire mais ça m'évite du traitement (pour tout dire je ne sais pas le faire autrement).

    si tu as des problèmes d'encodage (ce qui est probablement le cas si tu gères les majuscules accentuées) mb_​convert_​case avec le flag MB_CASE_TITLE.
    Enfaite le fait est que j'utilise cette fonction car mb_convert_case ne fonctionne pas lorsqu'il y a un caractère autre qu'une lettre.
    En demandant à mon enseignant il m'a faits comprendre que je ne peux pas me déplacer dans mon tableau de cette manière : un caractère accentué prenant forcement plus de d'octet qu'un caractère alpha-numeric.
    De ce fait il faut que j'utilise la fonction : mb_substr.
    Par exemple :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8"/>
    		<title>Probleme boucle i</title>
    	</head>
    	<body>
     
    		<?php
     
    		echo "<PRE>";
     
    		$ch = "123ééééééé L0 wOrL2 !";
    		$i = 0;
     
    		$nb = strlen($ch);
     
    		echo "$nb\n";
    		while($i != $nb)
    		{
    			echo "$i : $ch[$i]\n";
    			$i++;
    		}
    		$i = 0;
     
    		while($i != $nb)
    		{
    			echo "$i :".mb_substr($ch,$i,1,'UTF-8')."<br/>";
    			$i++;
    		}		
     
     
    		echo "</PRE>"
     
    		?>
    	</body>
    </html>
    Ici ça fonctionne.

    Désormais il faut que je l'implémente (et là je sèche un peu). Je vais continuer à voir comment je peux faire et je reviens vers vous si j'ai des résultats.
    Si vous avez des avis je suis preneur

  5. #5
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Tu as testé le code que je propose ? Qu'est ce qui ne va pas avec ?

    Si c'est le mb_convert_case qui pose problème, tu peux forcer l'encodage comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mb_convert_case($s, MB_CASE_TITLE, 'UTF-8');
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    il y a quelques temps, j'ai écrit une fonction pour les noms de famille.

    Code php : 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
    function formatage_nom_de_famille( $chaine )
    {
    	$chaine							= trim( $chaine );
    	if( !empty( $chaine ) ){
    		$chaine						= ' '.$chaine.' '; // On ajoute des espaces avant et après
    		// -----------------
    		// 1/ spécial : L' ou D'
    		$pattern					= '/( [ld])[\'’]/i';
    		$chaine 					= preg_replace($pattern, ' $0§ ', $chaine);
    		// -----------------
    		// 2/ tout en minuscules + première lettre de tous les mots en majuscule
    		$chaine						= mb_convert_case($chaine,  MB_CASE_TITLE, "UTF-8");
    		// -----------------
    		// 3/ chiffres romains : en majuscules (II, III, IV, VIII, IX,...)
    		$chaine 					= str_replace(array(' ','-','/'), array(' §§ ',' §-§ ',' §/§ '), $chaine);
    		// au début : un espace ;  à la fin : [\W^\'] <-> [^A-Za-z0-9^\'] (tout sauf alphanumérique ou apostrophe)
    		$pattern					= '/ (M{0,4}(CM|CD|D?C{0,4})(XC|XL|L?X{0,4})(IX|IV|V?I{0,4})|[IDCXMLV])[\W^\']/i';
    		$chaine 					= preg_replace_callback($pattern, create_function(
    									'$matches', // guillemets simples importants (ou il faut protéger les caractères $ avec \$)
    									'return strtoupper($matches[0]);' // en majuscules
    									), $chaine);
    		$chaine 					= str_replace(array(' §§ ',' §-§ ',' §/§ '), array(' ','-','/'), $chaine);
    		// -----------------
    		// 4/ articles : en minuscule (le/la/les/de/du/des/l'/d')
    		$NON_array 					= array(' Et ', ' Le ', ' La ', ' Les ', ' De ', ' Du ', ' Des ', ' L\'§ ', ' L§ ', ' D\'§ ', ' D§ ');
    		$OUI_array 					= array(' et ', ' le ', ' la ', ' les ', ' de ', ' du ', ' des ', ' l\'',   ' l\'', ' d\'',   ' d\'');
    		$chaine 					= str_replace($NON_array, $OUI_array, $chaine);
    		// -----------------
    		$chaine 					= trim($chaine);
    		$chaine 					= str_replace('  ', ' ', $chaine);
    		// -----------------
    		// 1ère lettre toujours en Majuscule
    //		$chaine 					= ucfirst($chaine);
    	}
    	return $chaine;
    };

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $chaine = (!empty($_POST['chaine']) )? $_POST['chaine'] : '';
    	echo '"'.formatage_nom_de_famille( $chaine ).'"';
    ?>
    <form method="post">
    	<input type="text" name="chaine" value="<?php echo $chaine; ?>" />
    	<input type="submit" value="Go" />
    </form>
    à tester avec :
    • cécile de france
    • jean-paul ii et je retiens 1
    • richard ier coeur de lion
    • élisabeth ii d'angleterre
    • ...



    N.B. Par contre, je ne connais personne qui s'appelle "éÉ'é-É'bé" ou "123ééééééé L0 wOrL2 !"
    (je n'ai pas dû voyager dans les bons pays...)
    Dernière modification par Invité ; 06/10/2016 à 18h09.

  7. #7
    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
    Je ne sais pas si la question porte spécifiquement sur les prénoms ou si elle s'étend au nom de famille, mais un des problèmes qui me semble le plus embêtant lorsqu'on veut automatiser ce genre de truc, c'est bien les quotes et les apostrophes.

    mb_convert_case avec l'option MB_CASE_TITLE voit l'apostrophe comme un séparateur de mot mais pas le simple quote. Ce qui donne deux comportements différents pour ces deux caractères qui, dans la pratique sont mis l'un à la place de l'autre. D'autre part, quelque soit le comportement, il est difficile de s'en tenir à une règle. Par exemple si j'ai comme chaînes de départ: "gérard jourd'hui" et "patrick o'brian", j'obtiens "Gérard Jourd'hui" (correct) et "Patrick O'brian" (incorrect). Maintenant si j'ai des apostrophes à la place des simple quotes j'obtiens "Gérard Jourd’Hui" (incorrect) et "Patrick O’Brian" (correct).

    Bref, dés lors qu'on commence à creuser, on se retrouve avec une liste de cas particuliers à traiter longue comme le bras. C'est à se demander si c'est vraiment utile de faire quoi que ce soit, car après tout si les gens sont pas fichu d'écrire leur nom correctement c'est leur problème. D'autant plus que les trois quarts du temps ils ont eu une page de confirmation sous le nez.

    Il existe aussi un article assez populaire sur les noms et ce que l'on tient pour acquis à leur propos ( à base de gens avec plusieurs noms interchangeables voire combinables ou sans nom du tout ), je ne retrouve plus le lien. Si quelqu'un met la main dessus...
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Seb33300 Voir le message
    Tu as testé le code que je propose ? Qu'est ce qui ne va pas avec ?

    Si c'est le mb_convert_case qui pose problème, tu peux forcer l'encodage comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mb_convert_case($s, MB_CASE_TITLE, 'UTF-8');
    Désolé je viens de voir qu'elle fonctionne mais je n'arrive pas à comprendre son fonctionnement

    Je vois que tu fais le traitement directement de sorte à reconstruire un tableau à partir des apostrophes mais en ce qui concerne le array_map je suis KO.

    Pourrais-tu me l'expliquer si tu as le temps ?

    Sinon merci à tous pour votre aide. Je vais faire en sorte d'améliorer au mieux mon programme grâce à vos suggestions .

  9. #9
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Le même code découpé plus clairement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $str = "'éÉ'é-É'bé'";
     
    // Comme mb_convert_case ne sait pas gérer les apostrophes, on découpe la chaine sur les apostrophes
    $quote_array = explode("'", $str);  // On obtient un tableau qui contient : array("éÉ", "é-É", "bé")
     
    // On applique la fonction mb_convert_case sur chaque élément du tableau
    $quote_array =  array_map(function($s){ return mb_convert_case($s, MB_CASE_TITLE); }, $quote_array);
     
    // On reconstruit la chaine
    echo implode("'", $quote_array);
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Merci !

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

Discussions similaires

  1. [Smarty] Mettre la première lettre d'une chaine en majuscule
    Par titou624 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 30/08/2009, 18h10
  2. [PHP 5.2] [Tableaux] convertir la premiére lettre d'une chaine en majuscule
    Par gtraxx dans le forum Langage
    Réponses: 12
    Dernier message: 20/01/2009, 14h14
  3. Mettre en majuscule la première lettre d'un mot
    Par bobosh dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 05/09/2008, 07h55
  4. Mettre en majuscule la première lettre du nom d'une nouvelle feuille excel
    Par titemireille dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 16/06/2008, 22h31
  5. [RegEx] Mettre en majuscules les premières lettres accentuées
    Par Bibicmoi dans le forum Langage
    Réponses: 8
    Dernier message: 15/05/2006, 19h02

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