Résumer un texte sans couper les mots ou phrases

Soyez le premier à donner votre avis sur cette source.

Snippet vu 25 416 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

knasucre
Messages postés
6
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
31 octobre 2006
-
Pas mal ta source , à tester mais cela pourrais être bien utile pour les sites de news , merci et bonne prog a tous.
cs_bl1412
Messages postés
4
Date d'inscription
mercredi 10 septembre 2003
Statut
Membre
Dernière intervention
4 novembre 2008
-
Je me souviens avoir utilisé un script de ce genre, le problème au quel j'ai été confronté est lorsque la longueur du texte fixée (ici 250) arrive sur une balise et la divise en plein milieu.
Par exemple avec coupée avant la fermeture de la balise " />", des erreurs seront affichées dans le texte.
cs_olid
Messages postés
296
Date d'inscription
lundi 2 septembre 2002
Statut
Membre
Dernière intervention
28 janvier 2008
-
J'avais oublié de préciser... Mon script ne prend pas en charge la présence de codes HTML :o(
cs_bl1412
Messages postés
4
Date d'inscription
mercredi 10 septembre 2003
Statut
Membre
Dernière intervention
4 novembre 2008
-
C'est bien dommage :(
cs_dominion
Messages postés
230
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
15 mai 2008
-
bl1412 > Avec des regexp tu devrais pouvoir t'en sortir...

Sinon, je n'ai pas encore lu le source mais je le retiens, ça peut être très utile ^^

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.