PHP Passer en majuscule la première lettre de tous les mots

Résolu/Fermé
CH4NCE Messages postés 620 Date d'inscription jeudi 7 décembre 2006 Statut Membre Dernière intervention 8 août 2013 - 8 juil. 2013 à 00:21
med-hitman Messages postés 68 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 24 octobre 2013 - 24 oct. 2013 à 20:12
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
A voir également:

2 réponses

CH4NCE Messages postés 620 Date d'inscription jeudi 7 décembre 2006 Statut Membre Dernière intervention 8 août 2013 706
8 juil. 2013 à 01:18
Je me réponds pour passer le sujet en Résolu.
1
med-hitman Messages postés 68 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 24 octobre 2013 4
24 oct. 2013 à 20:12
Je te remercie pour cette fonction, qui me fait gagner un temps considérable !
0