8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai deux problème lors de la création de mon site tout premièrement un problème du côter de htmlentities(), puis ensuite avec substr()...

Avant d'envoyer les données dans les base de donnée je les passes dans htmlentities() comme ceci :


$chaine = htmlentities($chaine, EN_QUOTES, 'UTF-8');


Ensuite mon premier problème est lors de la lecture des chaînes je ne comprends pas pourquoi je n'ais pas besoin de html_entities_decode() pour afficher les chaines qui proviennent de la base de données avec des caractère spéciaux, tous ce fais automatiquement est-ce normal ?

Exemple : un chaine stocké "â en effet" dans la base de donnée, s'affiche "à en effet" sans utiliser aucune fonction de décodage...

Ensuite mon deuxième problème, c'est que lorsque j'utilise substr() pour découper une chaîne qui contient un caractère spéciaux, si par malheur la découpe s'ârrete au milleur d'un caractère spéciaux alors celui si est pas transformé en premier, mais le caractère HTML est donc coupé.

Exemple :


$chaine = "un copyright c'est ©";

$chaine = substr($chaine, 0, 21);

//cela affiche : un copyright c'est &c;
// au lieu de : un copyright c'est ©
htmlentities() renvoie la chaine de caractère avec les caractères spéciaux encodés en code ASCII.

Ce code n'est pas à proprement parlé un mode d'encodage de caractère, il n'y a donc aucun besoin de le décoder à la sortie; il est lu directement par le navigateur.

Cela dit ! Attention, passé ta string dans htmlentities() ne la rendra pas sécuritaire pour ta base de donnée, et les risques de XSS sont encore présent. Le mieux serait de passer par un filtre (fait un recherche sur Filter ou la fonction filter_var() ).

Pour ton problème avec substring, si tu passe ta chaîne dans htmlentities() c'est tout à fait normal que substring se comporte ainsi. Tu n'as qu'à spécifier un plus gros chiffre... ou utiliser des regexp.
Il n'y a aucune raison d'utiliser htmlentities si tu es en UTF-8. Tu dois utiliser htmlspecialchars() qui ne va convertir que certains caractères comme <,>, "...

En plus comme tu es en UTF-8 le résultat de substr sera faux sur une chaine contenant des accents.

Tu dois utiliser l'extension mbstring et ses fonctions comme mb_substr().

http://www.php.net/manual/fr/book.mbstring.php

tonymx15 a écrit :

Ensuite mon deuxième problème, c'est que lorsque j'utilise substr() pour découper une chaîne qui contient un caractère spéciaux, si par malheur la découpe s'ârrete au milleur d'un caractère spéciaux alors celui si est pas transformé en premier, mais le caractère HTML est donc coupé.


Découpe ta chaine au mot le plus proche plutôt :


// configuration du charset pour mbstring
mb_internal_encoding('UTF-8');

function truncate_text($string, $limit, $break=' ', $pad='') {
	
	// return with no change if string is shorter than $limit + $pad length
	if (mb_strlen($string) <= $limit + mb_strlen($pad))
		return $string;
	
	$string = mb_substr($string, 0, $limit);
	if (false !== ($breakpoint = mb_strrpos($string, $break)))
		$string = mb_substr($string, 0, $breakpoint);

	return trim($string).$pad;
}

$string = 'Voilà le texte à tronquer';
$string = truncate_text($string, 10);

Modifié par jb_gfx (09 May 2011 - 23:27)
Merci pour vos réponses, je suis maintenant plus éclairé ! Smiley cligne
Modifié par tonymx15 (10 May 2011 - 09:37)