Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/08/2011, 16h41   #1
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Par défaut Fonction "Tronquage" avec caractères spéciaux

Bonjour à tous,

Je souhaite faire une fonction pour tronquer des textes.
J'ai créé une fonction toute simple, mais je me suis aperçu que mes textes étant encodé, lorsqu'elle tronquait, il pouvait arriver que cela tronque au milieu d'un code html.
Par exemple "hôtel", pourrait être tronqué en "h&oc".
J'ai voulu donc ajouter un code, en convertissant avant de tronquer, et en reconvertissant ensuite pour l'affichage, mais je ne m'en sors pas.
Si le dernier caractères restant après tronquage est un caractère spécial, lorsque je ré-encode, alors il me renvoie une chaine vide !

Voilà mon code actuel :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function truncate($text, $length)
{
	$text=html_entity_decode($text,ENT_QUOTES,"UTF-8");
	$trunc = (strlen($text)>$length)?true:false; //si $trunc = taille du texte > $length (s'il y a au moins $length caractères), $trunc = true sinon $trunc =false
	if($trunc) //si $trunc = true
	{
		$text=substr($text, 0, $length);
		return htmlentities($text,ENT_QUOTES,"UTF-8").'...';
	}
	else
	{				
		return htmlentities($text,ENT_QUOTES,"UTF-8");
	}
}
Merci de votre aide.

P.
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 16h50   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Ni strlen ni substr ne sont appropriées pour de l'UTF-8. Pour ça, il faut aller chercher leurs équivalents dans mbstring (mb_strlen et mb_substr).

strlen, ici, renvoie le nombre d'unités de code et non de caractères, ce qui est totalement différent. Et substr, considère également les unités de code, donc vous pouvez effectivement couper en plein milieu de la représentation d'un caractère.

PS : il n'aurait fallu faire un htmlspecialchars qu'à la toute fin [pour l'affichage] parce que là ça complique inutilement la tâche.

Code :
1
2
3
4
5
6
7
8
mb_internal_encoding('UTF-8');
 
function truncate($text, $length) {
    if (mb_strlen($text) > $length) {
        $text = mb_substr($text, 0, $length) . '...';
    }
    return $text;
}
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 17h24   #3
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Trop fort !

Je ne connaissais pas du tout ce type de fonction.

Merci beaucoup !

Au passage, je cherche la même chose pour le faire avec une fonction javascript pour l'utiliser dans l'API Google Maps, est-ce que ça existe ?

Bonne journée.

P.
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 19h00   #4
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 994
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 994
Points : 5 787
Points : 5 787
Envoyer un message via Skype™ à jreaux62
Bonjour,
on s'était amusé à ca : Réparer du code HTML pour en arriver à ces fonctions.
(en évitant de couper des mots)

Ca m'a servi ici : Système de Gestion-Affichage de Nouvelles
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 19h38   #5
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Ah oui, comme tu dis , vous vous étiez amusé !
Merci. Je vais regarder ça.

Bonne soirée.
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 12h07   #6
Membre à l'essai
 
Inscription : décembre 2006
Messages : 169
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 169
Points : 21
Points : 21
Bonjour à tous,

Je suis un peu perplexe.
J'avais lancé ce sujet il y a quelques semaines, et la réponse apportée (sur la partie troncage en PHP) avait parfaitement fonctionnée.
Je m'aperçois aujourd'hui que cela ne fonctionne plus !

J'ai regardé et la fonction est toujours présente et inchangée :
Code :
1
2
3
4
5
6
7
mb_internal_encoding('UTF-8');
	function truncate($text, $length) {
		if (mb_strlen($text) > $length) {
			$text = mb_substr($text, 0, $length) . '...';
		}
		return $text;
	}
Il s'agit de titres extraits de ma table mysql.
Tous les champs de ma table sont déclarés en utf8.

Qu'est-ce qui pourrait influer sur le fait que la fonction ne marche plus ?

Merci de votre aide ?
Pierrick81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h56.


 
 
 
 
Partenaires

Hébergement Web