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 :

Amélioration d'une fonction de formatage [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 38
    Points
    38
    Par défaut Amélioration d'une fonction de formatage
    Bonjour à tous,

    Je viens de finir d'écrire une fonction pour formater les prénoms dans un formulaire d'inscription. Pas grand chose me direz vous, et pourtant j'y ai passé plus de temps que prévu.

    Ma fonction fait exactement ce que je voulais, c'est à dire:
    • Supprimer les espaces avant la première lettre et après la dernière lettre.
    • Passer toutes les lettres en minuscules (y compris celles avec des accents ou des lettres collées).
    • Passer la première lettre de chaque mot en majuscule (y compris celles avec des accents ou des lettres collées).


    Cette fonction prend en compte les noms composés comprenant un tiret de séparation (ex : Jean-Marc) les prénoms multiples sans tiret de séparation (ex : Philippe Louis Jean) et les prénoms avec accents exotiques ou des lettres collées (ex : Lætitia Gaëlle).

    Je veux même que cette fonction gère la combinaison de toutes ces particularités pour des prénoms totalement improbables (ex : GæñDrïn Œdêÿ Làn-Çûrs) au cas où des elfes utilisent ce formulaire.

    Je voudrais donc vous soumettre mon code pour que vous me disiez si je peux l'améliorer :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    function format_prenom($string)
    {
    	$string = trim($string);
    	$bloc = explode(" ",$string);
    	if(count($bloc)>1)
    	{
    		for($a=0;$a<=(count($bloc)-1);$a++)
    		{
    			$bloc[$a] = mb_strtolower($bloc[$a]);
    			$bloc[$a] = trim($bloc[$a]);
    			$sousBloc = explode("-",$bloc[$a]);
    			if(count($sousBloc)>1)
    			{
    				for($u=0;$u<=(count($sousBloc)-1);$u++)
    				{
    					$sousBloc[$u] = trim($sousBloc[$u]);
    					$upToLow = strtr($sousBloc[$u],'ŸŒ','ÿœ');
    					if((isset($upToLow[0])) && (!empty($upToLow[0])))
    					{
    						$first_lowToUp = strtoupper($upToLow[0]); 
    						$first_lowToUpSpec = strtr($first_lowToUp,'áàâäãåçéèêëíìîïñóòôöõúùûüýÿæœ','ÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝŸÆŒ');
    						$permute = substr_replace($upToLow,$first_lowToUpSpec,0,1 );
    						$sousBloc[$u] = $permute;
    					}
    				}
    				$agglo = implode("-",$sousBloc);
    				$bloc[$a] = $agglo;
    			}
    			else
    			{
    				$upToLow = strtr($bloc[$a],'ŸŒ','ÿœ');
    				if((isset($upToLow[0])) && (!empty($upToLow[0])))
    				{
    					$first_lowToUp = strtoupper($upToLow[0]); 
    					$first_lowToUpSpec = strtr($first_lowToUp,'áàâäãåçéèêëíìîïñóòôöõúùûüýÿæœ','ÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝŸÆŒ');
    					$permute = substr_replace($upToLow,$first_lowToUpSpec,0,1 );
    					$bloc[$a] = $permute;
    				}
    			}			
    		}
    		$final = implode(" ",$bloc);		
    	}
    	else
    	{ 
    		$bloc = trim($bloc[0]);
    		$caracMin = mb_strtolower($string);
    		$upToLow = strtr($caracMin,'ŸŒ','ÿœ');
    		$first_lowToUp = strtr($upToLow[0],'áàâäãåçéèêëíìîïñóòôöõúùûüýÿæœ','ÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝŸÆŒ');
    		$final = substr_replace($upToLow,$first_lowToUp,0,1 );
    	}
    	return $final;
    }

    Pour tester cette fonction je propose :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $string = " gæñDrïn œdêÿ-fiLmIn LàN-çÛrS  ";
    $fp = format_prenom($string);
    echo $fp;

    Je précise que les prénoms passent avant par une fonction de vérification qui refuse tous les caractères numériques et spéciaux autres que ceux présent dans un tableau des caractères valides.

    Voilà, merci à l'avance pour vos commentaires constructifs.

    Cordialement.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    je pense qu'avec ton code, tu vas avoir de gros soucis. Tu utilises des fonctions de manipulation des textes incompatibles avec UTF-8 : explode strtr strtoupper substr_replace.
    Ce genre de chaine : GæñDrïn Œdêÿ Làn-Çûrs fait appel a des caractères qui dépassent ce que la norme ISO-8859-1 est capable de supporter.
    Il te faut passer tout en UTF-8. En conséquence tu peux reprendre entièrement ton code en utilisant les fonctions spécifiques pour les chaines multibytes : ici

    Et un peu de lecture ici

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    Bonjour rawsrc et merci pour ta réponse.

    J'ai parcouru les articles que tu m'as indiqué et j'ai découvert de nouvelles choses sur PHP. En effet les tests chez moi étaient concluant pour la bonne raison que mes pages étaient en php pur, pas de doctype HTML ni de balise.

    Une fois rajoutés tous ces éléments, mes accents n'apparaissaient plus correctement!

    Ce qui m'a un peu fait mal c'est de m'apercevoir en lisant les articles suggérés que mon code était totalement inutile puisque j'ai obtenu exactement le même résultat avec ce qui suit:

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php 
    	function format_prenom($string)
    	{
    		$string = trim($string);
    		$string = mb_convert_case($string,MB_CASE_TITLE,"UTF-8");
    		return $string;
    	}
    ?>

    En appelant ma fonction de la même façon qu'avant, j'obtiens bien l'affichage désiré.
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $string = " gæñDrïn œdêÿ-fiLmIn LàN-çÛrS  ";
    echo $string." <br />";
    $fp = format_prenom($string);
    echo $fp;
    ?>

    gæñDrïn œdêÿ-fiLmIn LàN-çÛrS --> Gæñdrïn Œdêÿ-Filmin Làn-Çûrs

    Merci à toi!

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

Discussions similaires

  1. [Toutes versions] amélioration d'une fonction pour trouver la lettre de la colonne
    Par illight dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 16/12/2013, 15h48
  2. Améliorer une fonction recherche VBA
    Par ric009 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/01/2013, 19h40
  3. Créer une fonction de formatage de chaîne ?
    Par pepito62 dans le forum PL/SQL
    Réponses: 5
    Dernier message: 06/01/2012, 11h24
  4. améliorer une fonction récursive
    Par shaku dans le forum Macros et VBA Excel
    Réponses: 32
    Dernier message: 26/11/2008, 00h43
  5. Réponses: 2
    Dernier message: 23/08/2007, 12h22

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