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

Résolu
CH4NCE Messages postés 620 Date d'inscription   Statut Membre Dernière intervention   -  
med-hitman Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   728
 
Je me réponds pour passer le sujet en Résolu.
1
med-hitman Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   4
 
Je te remercie pour cette fonction, qui me fait gagner un temps considérable !
0