Résumer un texte sans couper les mots ou phrases

0/5 (16 avis)

Snippet vu 25 432 fois - Téléchargée 29 fois

Contenu du snippet

Cette fonction recherche un point, une virgule (ou autres ponctuations) à proximité du nombre de caractères que l'on souhaite obtenir au maximum.
Au pire, elle cherche le dernier mot qui ne depasse pas la limite.

Source / Exemple :


function YMA_Resume($description,$lng=250,$nxtstr='?')
	{
	if ((strlen($description) <= $lng) OR ($lng <= 0))
		{
		$res = $description;
		}
	else
		{
		// Longueur minimum du résumé
		$minLng = ceil($lng*1/2)+1;
		
		$lstPt = $lstComa = $lstQuote = $lstDblPt = 0;
		$mots = explode(' ',$description);
		$res = $mots[0];
		$nbMots = count($mots);
		$i = 1;
		// On reconstruit le texte mot par mot
		while($i < $nbMots)
			{
			$lenRes= strlen($res);
			$lenMot=strlen($mots[$i]);
			if (($lenRes+1+$lenMot) <= $lng)
				{
				$res = $res.' '.$mots[$i];
				if ($lenRes > $minLng)
					{
					$lstChar = substr($mots[$i],-1);
					if ($lstChar == ',')
						{
						// Césure de phrase
						$lstComa = $lenRes+1+$lenMot;
						}
					else if (($lstChar == '.') AND ($lenMot > 2)) // On evite les abreviations de nom ou prénom
						{
						// Fin de phrase
						$lstPt = $lenRes+1+$lenMot;
						}
					else if (($lstChar == ':') OR ($lstChar == ';'))
						{
						// Césure
						$lstDblPt = $lenRes+1+$lenMot;
						}
					}
				}
			else
				{
				break;
				}
			$i++;
			}
			
		
		if ($lstPt > 0)
			{
			$res = substr($res,0,$lstPt);
			}
		else if ($lstDblPt > 0)
			{
			$res = rtrim(substr($res,0,$lstDblPt-1)).$nxtstr;
			}
		else if ($lstComa > 0)
			{
			$res = rtrim(substr($res,0,$lstComa-1)).$nxtstr;
			}
		else
			{
			// Suppression des petits mots se trouvant à la fin
			// Inutile pour respecter la longueur maxi, mais plus convivial
			$tinyWords = array();
			//$tinyWords = array(':',';','a','à','au','aux','avec','ce','dans','sur','un','une');
			$tinyWords = array(':',';');
			while (in_array(strtolower($mots[$i-1]),$tinyWords))
				{
				$res = substr($res,0,-(strlen($mots[$i-1])+1));
				$i--;
				}
			
			$res = $res.$nxtstr;
			}
		}
		
	return $res;
	}

Conclusion :


Crée pour le projet http://ymobactus.miaouw.net portail Wap 2.0 d'actualités

A voir également

Ajouter un commentaire

Commentaires

cs_olid
Messages postés
296
Date d'inscription
lundi 2 septembre 2002
Statut
Membre
Dernière intervention
28 janvier 2008
-
Raaaaaaaaah merde, la fonction n'est pas faite pour du UTF8 (Cf. tinywords) ni pour de l'Unicode. Les strlen peuvent provoquer une mauvaise estimation de la longueur. Faut les remplacer par le strlen MultiBytes qui nécessite la présence de ce module sur le serveur.
cs_christobal
Messages postés
208
Date d'inscription
jeudi 3 octobre 2002
Statut
Membre
Dernière intervention
31 mars 2011
-
c'est dr?le car tu as trouv? un bug avec le ? et le ! alors que je te parlais du " a " avec accent.
Il semblerait que le systeme de post de phpcs est eu un petit souci de convertion de lettres accentu?s.
pour mon pb de txt court, il n'y a pas de html dans le txt.
j'aivais enlev? le html a cause des photos qu'il pouvais y avoir au debut des articles
cs_olid
Messages postés
296
Date d'inscription
lundi 2 septembre 2002
Statut
Membre
Dernière intervention
28 janvier 2008
-
Hum, tout d'abord, en production, j'ai été obligé de corriger plein de trucs, je partagerais un update asap.

Perso, jai désactivé les tinywords car çà merde beaucoup, et grosse perte de performance.

Et, tu me fais justement remarqué que la fonction ne gère pas les césures avec un ! ou ? ... Je vais plancher la dessus.

Enfin, n'oublie pas de fournir un texte sans HTML, via strip_tags... Ca peut expliquer ton petit résumé si ya du code CSS ;op
cs_christobal
Messages postés
208
Date d'inscription
jeudi 3 octobre 2002
Statut
Membre
Dernière intervention
31 mars 2011
-
bonjour,
je ne comprand pas pourquoi la phrase se termine apres un " ? "alors qu'il a ?t? d?finis dans les mots a ne pas prandre.
$tinyWords = array(':',';','a','?','au', ...
autre chose j'ai un r?sum? de 177 caracteres alor que j'en ai defini 400 dans la fonction et l'article contient plusieurs centaines de lignes.
merci de votre aide et bon week
cs_olid
Messages postés
296
Date d'inscription
lundi 2 septembre 2002
Statut
Membre
Dernière intervention
28 janvier 2008
-
Pour info, la version RegEx proposée n'a pas donnée le résultat espérée d'un point de vue effeicacité... Pas comparé pour les performances :op

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.