PHP Passer en majuscule la première lettre de tous les mots [Résolu/Fermé]

Signaler
Messages postés
616
Date d'inscription
jeudi 7 décembre 2006
Statut
Membre
Dernière intervention
8 août 2013
-
Messages postés
68
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
24 octobre 2013
-
Bonjour,
je viens poster ma petite fonction car je n'ai pas trouvé d'équivalent sur l'internet.
L'objectif est de formater un nom composé, ou le nom d'une ville, en transformant les premiers caractères de chaque mot en majuscule et le reste en minuscule.
Tous les scripts que j'ai testé ne fonctionnent pas lorsque la première lettre est accentuée (éèàç etc).
A coups d'explode, de mb_substr et de strto... j'ai fini par obtenir le résultat souhaité.

Le code risque de piquer les yeux des plus expérimentés, il est très probablement possible de le raccourcir et d'améliorer les performances... mais je suis certain d'aider quelques personnes.
//A ajouter au début du programme, par exemple dans le fichier index après session_start() :
mb_internal_encoding('UTF-8');


function formatNom($str)
{
	//on utilise formatMot(delimiteur, chaine) pour chaque séparateur possible
	$str=mb_strtolower($str);
	
	$strTmp= formatMot("'",formatMot(' ',formatMot('-',formatMot(',',formatMot(':',$str)))));
	if($strTmp===$str)
	{
		$part1=mb_strtoupper(remplace_accents(mb_substr($str, 0, 1)));//on applique remplace_accents 
		$part2=mb_substr($str, 1, mb_strlen($str));//on applique mb_strtolower au reste de la chaine
		$strComplet=$part1.$part2;
		return $strComplet;
	}
	else return $strTmp;
}

function formatMot($delim,$str)
{
	$strComplet=null;
	$delimForm="/".$delim."/";//sans ça preg_match refuse la chaine...
	if(preg_match($delimForm, $str))//Si il y a le delimiteur >
	{
		$strTmp=explode($delim, $str);//on explose
		$nbP=count($strTmp);//on compte le nombre de caractere de la chaine
			$part1=mb_strtoupper(remplace_accents(mb_substr($strTmp[0], 0, 1)));//on applique remplace_accents 
																																		//puis mb_strtoupper au premier caractere de la chaine
			$part2=mb_substr($strTmp[0], 1, mb_strlen($strTmp[0]));//on applique mb_strtolower au reste de la chaine
			$strComplet=$part1.$part2;//on rassemble les 2 parties de la chaine (premier caractere et les autres)
		for($i=1;$i<$nbP;$i++)
		{
			//on fait la même chose pour les autres chaines tirées de l'explode en remettant le délimiteur pour obtenir la chaine complete
			$part1=mb_strtoupper(remplace_accents(mb_substr($strTmp[$i], 0, 1)));
			$part2=mb_substr($strTmp[$i], 1, mb_strlen($strTmp[$i]));
			$strComplet.=$delim.$part1.$part2;
		}
		return $strComplet;
	}
	else return $str;
}

function remplace_accents($item, $charset='utf-8')
{
	$item = htmlentities($item, ENT_NOQUOTES, $charset);
	
	$item = preg_replace('#\&([A-za-z])(?:uml|circ|tilde|acute|grave|cedil|ring)\;#', '\1', $item);
	$item = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $item); // pour les ligatures e.g. '&oelig;'
	$item = preg_replace('#\&[^;]+\;#', '', $item); // supprime les autres caractères

	return $item;
}


formatNom("ééé ééé,ééé:ééé-ééé") //=> Eéé Eéé,Eéé:Eéé-Eéé
formatNom("jean-yVEs éperVier") //=> Jean-Yves Epervier

2 réponses

Messages postés
616
Date d'inscription
jeudi 7 décembre 2006
Statut
Membre
Dernière intervention
8 août 2013
445
Je me réponds pour passer le sujet en Résolu.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 56962 internautes nous ont dit merci ce mois-ci

Messages postés
68
Date d'inscription
dimanche 19 août 2007
Statut
Membre
Dernière intervention
24 octobre 2013
4
Je te remercie pour cette fonction, qui me fait gagner un temps considérable !