IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Fonctions de troncature de texte [Tutoriel]


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Fonctions de troncature de texte
    PHP - Fonctions de troncature de texte

    Ces fonctions font suite à une discussion fort intéressante concernant la "réparation de code HTML".
    Création en juin 2009 en collectif : Xunil, jreaux62, s.n.a.f.u., christele_r, Doksuri, Patouche.

    1/ "Résumé brut" d'un texte (html ou non) :
    -> Le résumé est affiché sans formatage (sans balises html) ;
    -> les balises html sont supprimées ;
    -> le texte est tronqué à une nombre de caractères donné, en évitant de couper un mot.

    2/ "Résumé html" d'un texte (html) : -> Le résumé est affiché formaté, en conservant la mise en forme HTML du contenu ;
    -> les balises html sont conservées (ce qui permet aussi d'afficher les smileys !) ;
    -> le texte est tronqué à une nombre de caractères donné, en évitant de couper un mot.

  2. #2
    Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 118
    Points : 54
    Points
    54
    Par défaut Excellent
    Je tien à vous remercier à ce travail vraiment bien détaillé.

    j'ai une question en ce qui concerne la langue arabe si je veux utilisé ces scriptes pour trois langues français arabe et l'anglais comment je doit faire pour l'arabe?

    Merci

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    c'est à dire ?

    Quelle particularité de la langue arabe pose problème ?

    As-tu testé sur un exemple ?

  4. #4
    Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 118
    Points : 54
    Points
    54
    Par défaut
    Je suis en cour de création d'un outil de résumer de texte en arabe voilà le prototype en français je suis au début j'ai aucun script crée

    je suis à la recherche pour bien encadrer mon projet pour aidée moi de résumer mes textes multi-langues!

    Merci pour votre réaction Monsieur.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Les Fonctions de troncature de texte n'ont pas pour vocation de "résumer" un texte, au sens où tu l'entends.
    Il s'agit juste de réduire un contenu au nombre de caractères demandé.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    L'article a été mis à jour : Fonctions de troncature de texte

    2. Fonction : "Résumé brut"
    • 2-A. "Résumé brut" en fonction du nombre de caractères
    • 2-B. "Résumé brut" en fonction du pourcentage de caractères


    3. Fonction : "Résumé html"
    • 3-A. "Résumé html" en fonction du nombre de caractères
    • 3-B. "Résumé html" en fonction du pourcentage de caractères

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut jreaux62,

    Il faudrait préciser dans l'introduction que ces fonctions ne sont pas compatibles avec l'utf-8.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci pour la remarque.

    Pourquoi ne seraient-elles pas compatibles UTF-8 ?
    (je les utilise sans problème sur des sites UTF-8)
    Que devrais-je ajouter pour les rendre compatibles ?

    N.B. Mais c'est vrai qu'elles ont été crées en 2009.
    Je vais les actualiser, avec ton aide éclairée.

  9. #9
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Tu trouvers toutes les explications ici.
    Si tu n'as pas rencontré de problèmes avec ton code, c'est que tu n'as codé que des sites UTF-8 conservant l'alphabet occidental dont le codage reste inchangé lors du passage à l'UTF-8.
    Petit veinard, va, tu n'as pas encore eu à t'arracher les cheveux sur les chouettes problèmes d'encodage en PHP...

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Oui en fait ça dépend car un strpos dans un substr n'est pas toujours gênant même en utf-8 car les erreurs peuvent s'annuler (c'est aussi expliqué dans le lien donné par rawsrc

    J'avais fait un tuto sur l'encodage utf-8 sur un autre forum et je m'étais par la même occasion intéressé aux troncatures de texte. Après bench j'avais remarqué qu'il ne fallait pas utiliser strlen sur la longueur totale du texte car c'est très handicapant sur les chaines très longues.
    Ainsi si l'on considère cette fonction pour couper une chaine de caractères après x caractères sans couper un mot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function truncate($string,  $size, $encodage  = 'utf-8')  {
     
            if (mb_strlen($string, $encodage) <= $size) // pas de modif. Ici pb de performance si $string très long    
            return $string;
     
            $string = mb_substr($string, 0, $size, $encodage); // coupe la chaine à la taille max désirée
     
            // recherche le dernier espace (s'il y en a un). Ici ce n'est pas vraiment optimisé mais la chaine est déjà réduite donc pas le pb principal
            $lastSpace = (strrpos($string, ' ')) ? strrpos($string, ' ') : strlen($string);
     
            // retourne la chaine coupée proprement (au dernier espace), suivi des points de suspension
            return substr($string, 0, $lastSpace) . '...';
    }
    Une solution plus équilibrée et optimisée est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function truncate($string, $size, $encodage = 'utf-8') {
     
            $chaine = mb_substr($string, 0, $size, $encodage); // coupe la chaine à la taille max désirée
     
            if ($chaine == mb_substr($string, 0, $size + 1, $encodage)) // pas de modif. Cette étape évite d'utiliser strlen sur la longueur totale de la chaine 
            return $chaine;
     
            // recherche le dernier espace (s'il y en a un)
            if ($lastSpace = strrpos($chaine, ' '))
            return substr($chaine, 0, $lastSpace) . '...'; 
            else
            return $chaine . '...';
    }
    La deuxième fonction sera environ deux fois moins rapide sur des chaines très courtes ou encore s'il n'y a rien à tronquer, mais sur un temps de traitement déjà très court puisque les chaines à traiter sont très courtes.

    Les deux fonctions s'équilibrent aux alentours de chaines de plus de 300 caractères, et par la suite la différence sera d'autant plus importante que la longueur de la chaine à traiter est importante.
    Cela peut aller de plusieurs fois à plusieurs dizaines de fois plus rapide pour la deuxième fonction avec des chaines de plusieurs milliers ou dizaines de milliers de caractères.

    Dans la deuxième partie des fonctions on peut utiliser strrpos et substr car les erreurs combinées induites par l'utf-8 s'annulent.

  11. #11
    Invité
    Invité(e)
    Par défaut
    @ rawsrc & ABCIWEB
    Merci, vos interventions m'ont interpelé.

    J'ai notamment pensé aux textes NE comportant PAS d'espaces entre les mots (!).
    C'est le cas notamment du japonais, chinois (autre ?).

    (pour tester, j'ai trouvé un lorem ipsum aussi en japonais)

    J'en suis donc arrivé à cela :
    Code php : 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
    function texte_resume_brut($texte, $nbreCar)
    {
    	$texte 						= trim(strip_tags($texte)); // suppression des balises HTML
    	if(is_numeric($nbreCar))
    	{
    		$PointSuspension		= '...'; // points de suspension
    	//	$PointSuspension		= '';	 // (décommentez si vous ne voulez pas de points de suspension)
    		// ---------------------
    		$LongueurAvant			= mb_strlen($texte);
    		// ponctuations : on ajoute un esapce après
    		$texte					= str_replace(array('.',',',';',':','!','?','、','。','  '), array('. ',', ','; ',': ','! ','? ','、 ','。 ',' '), $texte);
     
    		// COUPE DU TEXTE pour le RÉSUMÉ
    		if ($LongueurAvant > $nbreCar) {
    			// ajout d'un espace de fin au cas où le texte n'en contiendrait pas...
    			$texte				.= ' ';
    			// pour ne pas couper un mot, on va à l'espace suivant
    			$texte = mb_substr($texte, 0, strpos($texte, ' ', $nbreCar));
    			// On ajoute (ou pas) des points de suspension à la fin si le texte brut est plus long que $nbreCar
    			if ($PointSuspension!='') {
    				$texte				.= $PointSuspension;
    			}
    		}
    		// ---------------------
    	}
    	// On renvoie le résumé du texte correctement formaté.
    	return '('.$LongueurAvant.') '.$texte;
    };
    Dernière modification par Invité ; 02/10/2013 à 00h22. Motif: suppression de code inutile et surtout : faux !

  12. #12
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 102
    Points : 4 448
    Points
    4 448
    Par défaut
    Mais tout ca a été réglé depuis des années avec la sortie de PHP 6



    edit : @jreaux62

    en 2008-9, j'avais sur ma machine php6 (alpha ou beta), et php6 était unicode natif

    tu n'étais pas encore né ? http://www.exinsidephp.com/2010/03/2...ort-vive-phpx/
    $moi= ( !== ) ? : ;

  13. #13
    Invité
    Invité(e)
    Par défaut
    @papajoker

    Explique-toi...

    N.B. Je n'ai pas pris le japonais au hasard.
    J'ai effectivement des sites traduits en japonais.

    [edit] En 2008-9, j'étais né, mais ce n'était pas ma meilleure période de vie...
    <- Inscription : août 2008
    Dernière modification par Invité ; 01/10/2013 à 20h51.

  14. #14
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut jreaux62

    En fait je voulais surtout insister sur le fait d'éviter de faire un strlen sur la chaine entière... Je n'avais pas remarqué les effets de bord si on ne veut qu'un mot, mais c'est quand même exceptionnel et en tous cas insuffisant si l'on veut se faire une petite idée d'un texte et c'est pour cela que la fonction a été conçue.

    Pour le reste ben je vois pas d'autre solution que de choisir ou adapter la fonction suivant que la langue traduite possède ou non des espaces entre les mots. Faut parfois s'imposer quelques contraintes si l'on veut le meilleur fonctionnement dans tous les cas.. Ou peut-être demander conseil à nos amis japonais pour savoir comment ils s'y prennent pour ce genre de fonctions...

  15. #15
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Re bonjour (ou plutôt bonsoir)

    Je viens de faire quelques tests en allant sur le lien "lorem ipsum aussi en japonais"

    AVG antivirus m'affiche : Exploit invisible IFRame injection type 1707
    AVG a supprimé la menace et j'ai pu copier les chaines de caractères.
    (c'est pour info mais je suis incapable de vous dire si la menace est réelle ou pas, toutefois méfiance).

    Donc j'ai fais des tests et je n'arrive pas à reproduire les pb que tu mentionne en utilisant la deuxième fonction que j'ai donnée en exemple. Dans la fonction "truncate", l'argument "size" indique le nombre de caractères maximum que l'on souhaite garder.

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $chaine = "gentil";
    echo truncate($chaine, 1);
    cela m'affiche bien g...

    Pour les caractères japonais ou les chaines sans espaces, ça les coupe bien comme attendu.

    Et s'il y a des espaces ça coupe à l'espace précédent le mot qui dépasse la longueur maximale voulue, donc c'est aussi le comportement attendu. En effet quelques caractères de plus pourraient être incompatibles avec un espace d'affichage restreint.

    Donc pour moi je ne vois pas de défaut, mais on a peut-être pas le même cahier des charges

  16. #16
    Invité
    Invité(e)
    Par défaut
    Hello,
    tu as raison.
    J'ai dû m'emmêler les pinceaux dans mes tests (à force de modifier les fonctions...)

    [EDIT] J'ai trouvé : stupide erreur...
    Même nom de variable -> les fonctions s'enchainaient : je tronquait une chaine... déjà tronquée !...
    Tous mes tests étaient faussés !

    DONC : ta fonction fonctionne parfaitement. (mea culpa )

    @ABCIWEB : PUIS-JE UTILISER TA FONCTION DANS MON TUTOS ?
    (je te citerai, évidemment)


    Ce qui m'a "mis dedans" (en 2009), c'était de vouloir conserver le DERNIER MOT ENTIER, en tronquant à l'espace SUIVANT.

    Alors que tu le supprimes et tronques à l'espace PRÉCÉDENT.
    Ce qui ne présente que des avantages par rapport à "ma" (mauvaise) solution...
    sauf en japonais/chinois, si un espace existe et se trouve très en amont du texte : le texte tronqué est du coup beaucoup plus court (ce qui est mieux que beaucoup plus long...)

    Finalement le SEUL VRAI problème :
    les caractères japonais sont 2 fois plus longs que les caractères latins !
    La chaine est donc 2 fois plus longue, pour un même nombre de caractères voulu...

    A suivre, donc...

    J'étudierai une "version spéciale" japonais/chinois !
    Dernière modification par Invité ; 02/10/2013 à 00h52.

  17. #17
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 102
    Points : 4 448
    Points
    4 448
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Finalement le SEUL VRAI problème :
    les caractères japonais sont 2 fois plus longs que les caractères latins !
    La chaine est donc 2 fois plus longue, pour un même nombre de caractères voulu...
    tu ne parles pas de l'UTF la ? la largeur est variable

    UTF8 : Largeur Variable de codage, compatibles avec ASCII. Les caractères ASCII (U + 0000 à U + 007F) prendre 1 octet, code points de U + 0080 à U + 07FF prendre 2 octets, des points de code U + 0800 à prendre de U + FFFF 3 octets, les points de code U + 10000 à U + 0x10FFFF prendre 4 octets.
    Bon pour le texte anglais, pas très bon pour le texte asiatique.

    UTF16 : Codage de largeur Variable. Points de code U + 0000 à U + FFFF prennent 2 octets, les points de code U + 10000 à U + 0x10FFFF prennent 4 octets.
    Bad pour le texte anglais, bonne pour le texte asiatique.

    UTF32 : Codage de largeur fixe. Tous les points de code prennent 4 octets. Un porc mémoire énorme, mais rapide à exploiter sur. Rarement utilisé.
    $moi= ( !== ) ? : ;

  18. #18
    Invité
    Invité(e)
    Par défaut
    Oui, je sais.
    Et je reste en UTF-8.

    Je parle de la largeur voulue du texte final.

    Le but d'une troncature, en général, est de "tenir" dans une "case" donnée. Sans dépasser.

    Le "nombre de caractères" n'est alors plus forcément un critère "fiable", avec les langues exotiques.

    Mais est-ce possible de compter en fonction du "nombre d'octets" ?

    [edit] Je viens de tomber là-dessus :

    La taille nécessaire à un caractère peut aller jusqu'à 4 octets.
    Un caractère japonais multi-octets occupe généralement deux octets, à comparer avec les caractères mono-octet traditionnellement utilisés. Ces caractères sont appelés "zen-kaku", ce qui signifie "grande largeur". Les plus petits sont appelés "han-kaku", ce qui signifie "demi-largeur".
    Je continue à creuser... Ce n'est pas encore ce soir que je vais me reposer... (mais le défi est intéressant !)
    Dernière modification par Invité ; 02/10/2013 à 01h32.

  19. #19
    Invité
    Invité(e)
    Par défaut Discussion de groupe
    Je viens de décider qu'il s'agit d'une Discussion de groupe.

    Comme en 2009, je trouve que travailler ensemble sur une même problématique et en tirer des conclusions/fonctions est très motivant, pas vous ?

    Vous serez donc TOUS cités comme co-auteurs des résultats que nous sortirons de ce brain-storming collectif.

    Et c'est bien de montrer au MONDE ENTIER DE L'UNIVERS que les membres de DVP coopèrent pour faire évoluer le progrès de l'avenir !
    (Houlà ! je suis quand même fatigué...)

  20. #20
    Invité
    Invité(e)
    Par défaut
    EUREKA !
    Après moult recherche et moult tests, je pense avoir trouvé le Graal qui satisfait à tous mes caprices !

    Il suffit essentiellement d'utiliser (la richesse des fonctions PHP ne cesse de m'épater !) :

    mb_strcut() extrait une sous-chaîne depuis une chaîne, d'une façon similaire à la fonction mb_substr(), mais opère sur les octets au lieu des caractères.
    Si le découpage intervient entre 2 octets d'un caractère multi-octets, le découpage sera effectué au début du premier octet de ce caractère.
    C'est également la différence avec la fonction substr() qui coupera la chaîne au milieu des octets, résultant ainsi en une séquence d'octets mal-formée.
    Code php : 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
    function NEW_texte_resume_brut($texte, $nbreOctet)
    {
    	$encodage 					= 'UTF-8';
    	$texte 						= trim(strip_tags($texte)); // suppression des balises HTML
    	if(mb_detect_encoding($texte) != 'UTF-8'){
    		$texte 					= utf8_encode($texte);
    	}
    	if(is_numeric($nbreOctet))
    	{
    		$PointSuspension		= '...'; // points de suspension
    	//	$PointSuspension		= '';	 // (décommentez si vous ne voulez pas de points de suspension)
    		// ---------------------
    		// COUPE DU TEXTE
    		$resume = mb_strcut($texte, 0, $nbreOctet, $encodage); // coupe la chaine à la taille max désirée
    		// Cette étape évite de calculer la longueur totale de la chaine 
    		if ($resume == mb_strcut($texte, 0, $nbreOctet + 1, $encodage)
    		&& $resume == mb_strcut($texte, 0, $nbreOctet + 2, $encodage)
    		&& $resume == mb_strcut($texte, 0, $nbreOctet + 3, $encodage)
    		){
    			return $resume;
    		}
    		// recherche le dernier espace (s'il y en a un)
    		if ($lastSpace = mb_strrpos($resume, ' '))
    			return mb_strcut($resume, 0, $lastSpace, $encodage) . $PointSuspension; 
    		else
    			return $resume . $PointSuspension;
    	} else {
    		return $texte;
    	}
    }
    Les tests :
    (223) Il circule des centaines de versions différentes du Lorem ipsum, mais ce texte aurait originellement été tiré de l'ouvrage de Cicéron, De Finibus Bonorum et Malorum (Liber Primus, 32), texte populaire à cette époque.
    (coupe à 60)
    truncate() :
    (58) Il circule des centaines de versions différentes du Lorem...
    NEW_texte_resume_brut() :
    (58) Il circule des centaines de versions différentes du Lorem...
    Si les 2 fonctions sont équivalentes en latin, la différence est très nette en japonais :
    (249) 文書のレイアウトを決める際、テキストの入る部分はべた塗りや記号にするよりは実際の出来上がりに近いフォントによる文章を入れた方が完成時の姿を想像しやすい。しかし一方で。
    (coupe à 60)
    truncate() :
    (180) 文書のレイアウトを決める際、テキストの入る部分はべた塗りや記号にするよりは実際の出来上がりに近いフォントによる文章を入れ...
    NEW_texte_resume_brut() :
    (60) 文書のレイアウトを決める際、テキストの入...
    Avec NEW_texte_resume_brut(), les longueurs des textes tronqués sont inférieur à 60 "caractères d'un octet", en latin et en japonais.
    CQFD.
    Dernière modification par Invité ; 02/10/2013 à 04h49.

Discussions similaires

  1. Réponses: 8
    Dernier message: 29/11/2004, 16h28
  2. [SYBASE] Fonctions SYBASE mathématiques et textes
    Par Ludolitaliano dans le forum Sybase
    Réponses: 3
    Dernier message: 30/09/2003, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo