begin process at 2012 02 11 16:59:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Chaîne de caratère

 > RÉSUMER UN TEXTE SANS COUPER LES MOTS OU PHRASES

RÉSUMER UN TEXTE SANS COUPER LES MOTS OU PHRASES


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Chaîne de caratère Classé sous :resume, texte, réduire, résumer, résumé Niveau :Débutant Date de création :30/10/2006 Date de mise à jour :30/10/2006 16:05:45 Vu :21 864

Auteur : olid

Ecrire un message privé
Site perso
Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

 Description

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

  • 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;
  • }
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


 Historique

30 octobre 2006 16:05:46 :
Correction

 Sources du même auteur

GÉNÉRER UN LOG AU FORMAT APACHE POUR FAIRE DES STATISTIQUES ...
TEMPS ÉCOULÉ (DURÉE) ENTRE 2 DATES SOUS FORME LITTÉRAL NATUR...
RACCOURCIR INTELLIGEMMENT UNE URL POUR L'AFFICHAGE SUR UNE P...
AFFICHER UNE DATE-HEURE RÉCENTE DANS UN FORMAT NATUREL ET LI...
Source avec Zip MY LAST RSS, CLASSE POUR PARSER ET FUSIONNER PLUSIEURS FEEDS...

 Sources de la même categorie

ADRESSE ABSOLUE DE LA PAGE EN COURS, AVEC VARIABLES $_GET par Dariumis
Source avec Zip CLASSE D'OBJET DE RECHERCHE DE MOTS DANS DES TABLEAUX ET/OU ... par 8Tnerolf8
RÉCUPÉRER LES MINIATURES D'UNE VIDÉO YOUTUBE par tefa24600
Source avec Zip Source avec une capture CONVERTISSEUR DE NOMBRES EN TEXTE par macruz
Source avec Zip Source avec une capture CODAGE TEXTE >HTML, ISO, SPECIALCHARS, URL ET DECODAGE par Salva9473

 Sources en rapport avec celle ci

Source avec Zip CLASSE POUR RÉCUPÉRER UNE PORTION DE TEXTE HTML EN GARDANT L... par kirk57
Source avec Zip Source avec une capture CONVERTISSEUR DE NOMBRES EN TEXTE par macruz
Source avec Zip COMPRESSER (MINIMISER) UN FICHIER CSS par shevabam
Source avec Zip Source avec une capture MESSAGERIE INTERNE AVEC FICHIER TEXTE par polly19
Source avec Zip Source avec une capture TEXTE GRAPHIQUE SANS GDI par Hakumbaya

Commentaires et avis

Commentaire de knasucre le 31/10/2006 12:58:37

Pas mal ta source , à tester mais cela pourrais être bien utile pour les sites de news , merci et bonne prog a tous.

Commentaire de bl1412 le 31/10/2006 17:13:49

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 <img src="...." width="350" height="350" alt="ma photo" /> coupée avant la fermeture de la balise " />", des erreurs seront affichées dans le texte.

Commentaire de olid le 31/10/2006 17:40:12

J'avais oublié de préciser... Mon script ne prend pas en charge la présence de codes HTML :o(

Commentaire de bl1412 le 31/10/2006 18:16:54

C'est bien dommage :(

Commentaire de dominion le 02/11/2006 11:55:10

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 ^^

Commentaire de olid le 02/11/2006 12:34:36

C'est loin d'etre simple de gérer le HTML, il fodrait gerer des balises SCRIPT ou STYLE qui encadrent du contenu non-textuel

Les reg-ex, cest pas ma tasse de thé, mais si t'en fais une qui permet de recuperer le texte original sous forme d'un tableau avec un mot ou une balise par cellule, je peux tenter le coup...

Commentaire de jean84 le 02/11/2006 15:11:24

Salut !

"Les reg-ex, cest pas ma tasse de thé, mais si t'en fais une qui permet de recuperer le texte original sous forme d'un tableau avec un mot ou une balise par cellule, je peux tenter le coup..."
- Et avec explode(), tu n'arriverais pas au meme but ? Sa me parrait l'ideal non ?

=> http://www.php.net/manual/fr/function.explode.php

@++

Commentaire de bens59 le 18/11/2006 16:36:25

Voilà ce que cela pourrait donner en Regex.
Beaucoup plus court et rapide, mais plus difficile à décrypter.
On coupe la chaîne à la longueur maxi, puis on remonte jusqu'au premier espace trouvé ou jusqu'à la première ponctuation si elle n'est pas éloignée de plus de x caractères ($tronque_maxi) du dernier espace.
Bien sûr c'est adaptable et améliorable.


function resume($chaine, $longueur_maxi=250, $tronque_maxi=5 ) {
  if (strlen($chaine)>$longueur_maxi) {
    $c = substr(ltrim($chaine), 0, $longueur_maxi);
    preg_match('`.+(?=[,;\.])`s', $c, $out1);  // la chaîne raccourcie jusqu'à la dernière ponctuation
    preg_match('`.+(?=[ ])`s', $c, $out2);    // la chaîne raccourcie jusqu'au dernier espace
    // Si la ponctuation trouvée est trop loin du dernier mot on n'en tient pas compte
    if ( ( strlen($out2[0]) - strlen($out1[0]) ) < $tronque_maxi) {
      $c = $out1[0];
    } else {
      $c = $out2[0];
    }
// Supprime les mots courts en fin de phrase
    if (preg_match('`.+(?=(de|du|dans|le|la|a|à)$)`s', $c, $out3)) {$c = $out3[0];};
    return $c."...";
  } else {
    return $chaine;
  }
}

Commentaire de olid le 18/11/2006 17:56:48

Merciiiiiiiiiiiiii :o)

Je vais faire un test comparatif sur YMobActus pour voir ce que çà donne ;o)

Commentaire de christobal le 30/12/2006 13:24:08

Bonjour, pour étre franc je ne sais pas comment on utilise une fonction.
La variable qui serais concerné par ce code s'appel : $row_cherche_article['article'].
Comment appliquer cette fonction a cette variable ?

Merci et bonne année a tous

Commentaire de lTommyl le 27/12/2007 17:56:37 10/10

Copie et passe cette ligne a l'endroit ou tu le souhaite.

<?=YMA_Resume($row_cherche_article['article']) ?>

Bravo pour la source :)

Commentaire de olid le 28/01/2008 02:30:48

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

Commentaire de christobal le 17/05/2008 10:48:25

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

Commentaire de olid le 17/05/2008 17:09:04

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

Commentaire de christobal le 17/05/2008 17:47:25

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

Commentaire de olid le 17/05/2008 20:57:34

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.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Mise en form du texte [ par David ] J'utilise feuille html avec des contentsTout le texte qui contient des apostrophesdoit etre précéderde "\"exemplel'eau donne l\'eaucomment faire la mi Combien de fois revient le texte ??? [ par Michael ] Salut !J'ai une table (base de données) à 3 colonnes dont une colonne "libellé"Dans une page (HTML) j'ai une zone de texte dans laquelle je saisi une Combien de fois revient le texte ??? [ par Michael ] Salut !J'ai une table (base de données) à 3 colonnes dont une colonne "libellé"Dans une page (HTML) j'ai une zone de texte dans laquelle je saisi une Editer un fichier texte dans une zone de saisie [ par la_glisse ] Bonjour,je suis débutant et je cherche comment éditer un fichier texte dans une zone de saisie comme celle ou nous écrinons tous pour laisser nos mess Prise de texte d'un site [ par RockmanX ] Ben voila, je cherche à prendre un certains texte d'un certains site... comment faire??? Coment enregistrer une page web en texte [ par Ken2K ] C pour savoir kommen à partir d'une page on arrive a enregistrer cette page dans n'importe quel langage mails il faut que sa marche coute ke coute San Fichier [ par koko ] J'aimerais pouvoir ouvrir et écrire dans un fichier texte. Mais c'est pas du bete texte a écrire. 1. Quand j'écris quelques choses, le texte doit se Lecture de fichier [ par koko ] Je voudrais lire un fichier fichier.txt dans la page index.phpvoici ma fonction&lt;? echo "Texte: ". $fp = fopen("fichier.txt","r"); $donnees = fgets Comment afficher le contenu d'un fichier texte dans une page? [ par truckracing ] Bonjour. Je débute tout juste dans le PHP, et j'ai déjà un pb...Je suis en train de traduire mon site (www.coursesdecamions.com) en anglais, et j'ai d prob de retour à la ligne....lol [ par FleX ] Alors voila :Je rentre mon texte dans une case texte, la case texte a l'option wrap et est multiligne.Apres, quand j'affiche ce string dans une case t


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,058 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales