1. #1
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    10 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : août 2008
    Messages : 10 214
    Points : 20 306
    Points
    20 306

    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.
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  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
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    10 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : août 2008
    Messages : 10 214
    Points : 20 306
    Points
    20 306

    Par défaut

    Bonjour,
    c'est à dire ?

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

    As-tu testé sur un exemple ?
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  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
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    10 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : août 2008
    Messages : 10 214
    Points : 20 306
    Points
    20 306

    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é.
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  6. #6
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    10 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : août 2008
    Messages : 10 214
    Points : 20 306
    Points
    20 306

    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
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  7. #7
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 311
    Points : 10 591
    Points
    10 591

    Par défaut

    Salut jreaux62,

    Il faudrait préciser dans l'introduction que ces fonctions ne sont pas compatibles avec l'utf-8.
    # Dans la Création, tout est permis mais tout n'est pas utile...

  8. #8
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    10 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : août 2008
    Messages : 10 214
    Points : 20 306
    Points
    20 306

    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.
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  9. #9
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 311
    Points : 10 591
    Points
    10 591

    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...
    # Dans la Création, tout est permis mais tout n'est pas utile...

  10. #10
    Expert éminent

    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    4 440
    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 : 4 440
    Points : 8 388
    Points
    8 388

    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
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    10 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : août 2008
    Messages : 10 214
    Points : 20 306
    Points
    20 306

    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('.',',',';',':','!','?','&#12289;','&#12290;','  '), array('. ',', ','; ',': ','! ','? ','&#12289; ','&#12290; ',' '), $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;
    };
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  12. #12
    Membre émérite Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2013
    Messages
    1 130
    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 : 1 130
    Points : 2 382
    Points
    2 382

    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= ( !== ) ? : ;
    www.webstratege.fr

  13. #13
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    10 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : août 2008
    Messages : 10 214
    Points : 20 306
    Points
    20 306

    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
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  14. #14
    Expert éminent

    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    4 440
    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 : 4 440
    Points : 8 388
    Points
    8 388

    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

    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    4 440
    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 : 4 440
    Points : 8 388
    Points
    8 388

    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
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    10 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : août 2008
    Messages : 10 214
    Points : 20 306
    Points
    20 306

    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 !
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  17. #17
    Membre émérite Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    septembre 2013
    Messages
    1 130
    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 : 1 130
    Points : 2 382
    Points
    2 382

    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= ( !== ) ? : ;
    www.webstratege.fr

  18. #18
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    10 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : août 2008
    Messages : 10 214
    Points : 20 306
    Points
    20 306

    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 !)
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  19. #19
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    10 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : août 2008
    Messages : 10 214
    Points : 20 306
    Points
    20 306

    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é...)
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  20. #20
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    10 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : août 2008
    Messages : 10 214
    Points : 20 306
    Points
    20 306

    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.
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

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