Bonsoir,

Suite à mon précédent post : http://forum.alsacreations.com/topic.php?fid=17&tid=2170, j'ai essayé d'écrire une fonction php permettant d'éviter l'enregistrement, dans une base de données, de caractères interdits.

Je me suis aidé du script de dotClear d'une part, et de l'excellent article de Laurent Denis : http://openweb.eu.org/articles/caracteres_illegaux/

J'ai utilisé les références numériques plutôt que les entités caractères, est-ce judicieux ?

D'autre part, n'ayant pas l'obligation de tenir compte de ces caractères spéciaux, (sauf peut-être pour le oe du mot oeuf), ne serait-ce pas mieux de les remplacer par des caractères plus classiques ?

Par exemple remplacer l'apostrophe anglaise basse par une apostrophe "classique" ? Ceci pour ne pas remplir la base de références numériques ? (Mais peut-être n'est-ce pas gênant, c'est juste que cela me fait bizarre de voir écrit ces références dans la base ou le code source de la page de mon navigateur)

Voici la fonction en question :

function valid_chars($str)
{
	$conv = array(
	  chr(129) => '',
		chr(130) => '&#8218',
		chr(131) => 'ƒ',
		chr(132) => '„',
		chr(133) => '…',
		chr(134) => '†',
		chr(135) => '‡',
		chr(136) => 'ˆ',
		chr(137) => '‰',
		chr(138) => 'Š',
		chr(139) => '‹',
		chr(140) => 'Œ',
		chr(141) => '',
		chr(142) => '',
		chr(143) => '',
		chr(144) => '',
		chr(145) => '‘',
		chr(146) => '’',
		chr(147) => '“',
		chr(148) => '”',
		chr(149) => '•',
		chr(150) => '–',
		chr(151) => '—',
		chr(152) => '˜',
		chr(153) => '™',
		chr(154) => 'š',
		chr(155) => '›',
		chr(156) => 'œ',
		chr(157) => '',
		chr(158) => '',
		chr(159) => 'Ÿ'
	);
		
	// encodate utf8
	// $str = utf8_encode($str);
	return str_replace(array_keys($conv),array_values($conv),$str);
}


Voyez-vous une amélioration possible ?

Merci ! Smiley smile
Modifié par Yhann (05 Mar 2005 - 20:22)
Bonsoir,

J'ai modifié la fonction qui semble fonctionner correctement.

J'ai ajouté la possibilité de convertir certains caractères en caractères plus "classiques".

Je n'ai en effet pas besoin de reproduire certaines apostrophe, comme le guillemet anglais simple fermant, utilisé par Word, par exemple. Cela peut sembler illogique de ne pas vouloir la reproduire telle quelle, mais dans mon cas, son enregistrement dans MySQL est le résultat d'un copier-coller de texte issus de Word, et ne représente aucun intérêt.

Toujours est-il que par défaut, c'est bien une conversion conforme qui se produit.

// cette fonction convertit les caractères invalides en caractères valides.
// Utilisée pour l'iso-8859-1

// si $conform = TRUE, la conversion se fera au plus juste, en tenant compte du caractère original  
// sinon, on change le caractère non conforme en caractère "classique" (par
// exemple, si on entre une apostrophe anglaise (comme celle générée par Word), on la remplace par  
// une apostrophe droite.

// Explications ici :  http://openweb.eu.org/articles/caracteres_illegaux/
 
// (merci à Laurent Denis)

function valid_chars($str, $conform = 1)
{
	 $conv = array(
	    chr(129) => '',
		  chr(130) => '‚',  // apostrophe anglaise basse
		  chr(131) => 'ƒ',  // florin, forte musical
		  chr(132) => '„', // guillemet anglais bas
		  chr(133) => '…', // points de suspension
		  chr(134) => '†', // obèle, dague, croix (renvoi de notes de bas de page)
		  chr(135) => '‡', // double croix
		  chr(136) => 'ˆ',  // accent circonflexe
		  chr(137) => '‰', // pour mille
		  chr(138) => 'Š',  // S majuscule avec caron (accent circonflexe inversé) utilisé en tchèque
		  chr(139) => '‹', // guillemet simple allemand et suisse, parenthèse angulaire ouvrante
		  chr(140) => 'Œ',  // Ligature o-e majuscule
		  chr(141) => '',
		  chr(142) => '',
		  chr(143) => '',
		  chr(144) => '',
		  chr(145) => '‘', // guillemet anglais simple ouvrant(utilisé dans les guillemets doubles)
		  chr(146) => '’', // guillemet anglais simple fermant(utilisé dans les guillemets doubles)
		  chr(147) => '“', // guillemets anglais doubles ouvrants
		  chr(148) => '”', // guillemets anglais doubles fermants
		  chr(149) => '•', // boulet
		  chr(150) => '–', // tiret demi-cadratin (incise)
		  chr(151) => '—', // tiret cadratin (dialogue)
		  chr(152) => '˜',  // tilde
		  chr(153) => '™', // marque déposée
		  chr(154) => 'š',  // s minuscule avec caron (accent circonflexe inversé) utilisé en tchèque
		  chr(155) => '›', // guillemet simple allemand et suisse, parenthèse angulaire fermante
		  chr(156) => 'œ',  // Ligature o-e minscule 
		  chr(157) => '',
		  chr(158) => '',        // z minuscule avec caron (accent circonflexe inversé) utilisé en tchèque.
		  chr(159) => 'Ÿ'   // Y majuscule avec trema, présent en français dans quelques noms propres
	 );
	
   if (! $conform) {	
	    $conv[chr(130)] = chr(39); // apostrophe
			$conv[chr(145)] = chr(39); // apostrophe
			$conv[chr(146)] = chr(39); // apostrophe
			$conv[chr(132)] = chr(34); // guillemet
			$conv[chr(139)] = chr(34); // guillemet
			$conv[chr(155)] = chr(34); // guillemet
			$conv[chr(147)] = chr(34); // guillemet
			$conv[chr(148)] = chr(34); // guillemet
			$conv[chr(150)] = chr(45); // tiret
			$conv[chr(151)] = chr(45); // tiret
	    $conv[chr(133)] = chr(46).chr(46).chr(46); // points de suspension
	 } 	
	
	 return str_replace(array_keys($conv),array_values($conv),$str);

}


Je repose une question qui me préoccuppe : vaut-il mieux choisir les entités caractères ou numériques ?

Merci à vous, et peut-être que cette fonction vous servira.

A+

Euh... le forum affiche maintenant les entités ! La première partie du code ci-dessus est en fait la même que mon premier post (les commentaires en plus)

Modifié par Yhann (06 Mar 2005 - 20:20)