Afficher un extrait d’un article sans couper de mots
Dans un précédent article: Afficher les derniers articles et leurs catégories associées sur une page externe hors WordPress, deux méthodes, je vous parlais d’un moyen pour n’afficher qu’une partie d’un texte.
Le problème est que ce moyen pouvait couper des mots sans pitié.
Je vous propose donc d’afficher un extrait d’une chaine de caractères sans couper les mots.
Où on était
Nous allons reprendre le précédent code en le simplifiant, vous pourrez adapter la future méthode sans soucis par la suite:
<?php $titre="Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."; if(strlen($titre)>=33) { $titre=substr($titre,0,30) . " ..." ; } echo $titre; ?>
$titre retourne: Neque porro quisquam est qui d …
Comme on peut le voir, le mot « dolorem » est coupé et ce n’est pas terrible comme rendu. Voyons la solution que je propose.
Ma solution avec la fonction strrpos
Je propose d’utiliser la fonction strrpos, comme dit la doc:
Strrpos cherche la position de la dernière occurrence d’une sous-chaine dans une chaîne
Nous utiliserons l’espace comme sous-chaine. Donc le but du jeu est de détecter et trouver le dernier espace du titre. Et d’afficher tout ce qu’il y a avant si le titre est trop long.
Si on utilise toute la longueur du titre, on va détecter le dernier espace et rien ne nous dit que la longueur du titre correspond bien à notre limite de caractères max.
Donc on va « ruser » et forcer à avoir une longueur maximale au titre avant de chercher le prochain espace. C’est ce que nous avons déjà fait avec substr précédemment.
Puis nous utiliserons strrpos pour récupérer la dernière position de l’espace dans le titre.
Et enfin nous réutiliserons substr pour n’afficher que la partie qui nous intéresse.
Place au code
<?php $titre="Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."; //si $titre depasse la limite qu'on a imposé if(strlen($titre)>=33) { //on "bride" notre titre a 30 caracteres par exemple $titre=substr($titre,0,30); //on recupere la derniere position de l'espace, ici $espace=28 $espace=strrpos($titre, ' '); //puis nous rebridons notre titre a 28 caracteres (donc juste avant l'espace) et nous rajoutons nos trois petits points $titre=substr($titre,0,$espace)." ..."; } echo $titre; ?>
$titre nous retourne plus que « Neque porro quisquam est qui … « . Mission accomplie.
En complément, couper votre titre en fonction du nombre de mots
Vous pouvez aussi couper votre titre en fonction du nombre de mots avec une simple fonction qui est: str_word_count
<?php $titre="Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."; if(strlen($titre)>=33) { //on "bride" notre titre a 30 caracteres par exemple $titre=substr($titre,0,30); //on recupere un tableau contenant chaque mot $mot=str_word_count($titre, 1); //et on affiche les 4 premiers mots foreach($mot as $key => $mots) { if($key<4) { echo $mots." "; } } } ?>
Si vous tenez à votre variable finale ($titre_final), vous pouvez faire ceci pour récupérer le titre dans une variable:
<?php $titre="Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."; if(strlen($titre)>=33) { //on "bride" notre titre a 30 caracteres par exemple $titre=substr($titre,0,30); //on recupere un tableau contenant chaque mot $mot=str_word_count($titre, 1); //et on affiche les 4 premiers mots $titre_final=''; foreach($mot as $key => $mots) { if($key<4) { //echo $mots." "; $titre_final .=$mots." "; } } } echo $titre_final; ?>
Quelque soit le choix, vous obtenez ceci: « Neque porro quisquam est »
Solution encore plus tordue, utiliser le deuxième paramètre de str_word_count
Dans la précédente solution, nous avons utilisé le premier paramètre qui retournait un tableau contenant tous les mots trouvés à l’intérieur. Ici, nous allons utiliser le deuxième paramètre qui retourne un tableau associatif, où la clé indique la position numérique du mot à l’intérieur.
Donc si on était tordu, on pourrait analyser la position de chaque mot et voir si ça ne dépasse pas notre position max. Bah devinez quoi, je suis tordu 😀
Par exemple, pour bien comprendre:
<?php $titre="Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."; if(strlen($titre)>=33) { //on recupere un tableau associatif contenant chaque mot et sa position $mot=str_word_count($titre, 2); } print_r($mot); ?>
retourne:
Array ( [0] => Neque [6] => porro [12] => quisquam [21] => est [25] => qui [29] => dolorem [37] => ipsum [43] => quia [48] => dolor [54] => sit [58] => amet [64] => consectetur [77] => adipisci [86] => velit )
Donc comme on peut le voir, si on prend « 30 » en valeur on se fait **** mais c’est les risques du métier (et surtout de cette méthode) mais si ça vous intéresse, voici ce que je vous propose:
<?php $titre="Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."; if(strlen($titre)>=33) { //surtout ne pas brider le titre, sinon on risque de couper des mots! //$titre=substr($titre,0,30); //on recupere un tableau associatif contenant chaque mot et sa position $mot=str_word_count($titre, 2); //et on affiche que si la clé du mot est inferieure a 30 foreach($mot as $key => $mots) { if($key<31) { echo $mots." "; } } } ?>
Nous obtenons donc: « Neque porro quisquam est qui dolorem « . Hé oui dolorem commençant à la 29e position, on se fait **** pour 2 lettres 😉
Je vais arrêter là cet article, j’ai encore des idées encore plus bizarres donc pour le bien de tous, arrêtons là 😀
Si vous avez apprécié cet article, n’hésitez pas à le partager sur les réseaux sociaux et/ou de laisser un commentaire ci dessous.
Bon dev à vous 😉
2 réflexions au sujet de « Afficher un extrait d’un article sans couper de mots »
Temps approximatif pour la lecture des commentaires : 1 mins-
lsape Le 25 juin 2016 à 0 h 25 min
|
-
Julien Sibille Le 9 août 2018 à 9 h 45 min
|
Bonjour, j ai enfin trouve la solution pour mettre ce fichu bouton afficher la suite sauf que pour ma part, meme quand je clique dessus et que j accede a mon article, le bouton reste sur l article, comment faire pour qu il n apparaisse pas sur l article entier? Merci beaucoup!
Merci, très clair et efficace