Bonjour,
voici une fonction (qui... fonctionne !) pour :
- mettre tout en minuscules + première lettre de tous les mots en majuscule
- cas particulier : chiffres romains en majuscules (III, IV, XVI,...)
- articles en minuscules
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
<?php
// -----------------------------------------------------------
// FONCTION de formatage du NOM du Cheval
// tout en minuscules + première lettre de tous les mots en majuscule
// -----------------------------------------------------------
function adm_chx_formate_chevalNom( $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(' Le ', ' La ', ' Les ', ' De ', ' Du ', ' Des ', ' L\'§ ', ' L§ ', ' D\'§ ', ' D§ ');
		$OUI_array 					= array(' le ', ' la ', ' les ', ' de ', ' du ', ' des ', ' l\'',   ' l\'', ' d\'',   ' d\'');
		$chaine 					= str_replace($NON_array, $OUI_array, $chaine);
		// -----------------
	}
	return trim($chaine);
};
?>
Exemple :
ivoire iv, vicomte du haras de l'étang vi
=> Ivoire IV, Vicomte du Haras de l'Étang VI
Pour preg_replace()/preg_replace_callback() : je dois inclure le caractère suivant (non-alphanumérique, pour exclure les bouts de mots comme "Ivoire", "vicomte"

J'ai dû utiliser des "astuces" pour les cas particuliers => ajout d'espaces avant/après, caractère intermédiaire "§",...
Notamment quand 2 nombres romains se succèdent : VII/VIII, XIV-XVI,...

Est-il possible d'optimiser ce code ?
Merci !