From 2deb122b7ba16c7c94b7bd64492f6a55343dcb7d Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Tue, 21 May 2013 11:28:10 +0000
Subject: [PATCH] Ferme #2774 : supprimer_tags et couper avec un peu plus de
 precaution pour ne pas confondre la simple succession de < et > dans un texte
 avec un tag html a supprimer (ou comentaire html a supprimer)

---
 ecrire/inc/filtres.php    |  7 ++++---
 ecrire/inc/texte_mini.php | 12 ++++++------
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 3e3a8582b5..168b3563dd 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -681,10 +681,11 @@ function recuperer_numero($texte) {
  *     Texte converti
 **/
 function supprimer_tags($texte, $rempl = "") {
-	$texte = preg_replace(",<[^>]*>,US", $rempl, $texte);
-	// ne pas oublier un < final non ferme
+	$texte = preg_replace(",<(!--|\w|/)[^>]*>,US", $rempl, $texte);
+	// ne pas oublier un < final non ferme car coupe
+	$texte = preg_replace(",<(!--|\w|/).*$,US", $rempl, $texte);
 	// mais qui peut aussi etre un simple signe plus petit que
-	$texte = str_replace('<', ' ', $texte);
+	$texte = str_replace('<', '&lt;', $texte);
 	return $texte;
 }
 
diff --git a/ecrire/inc/texte_mini.php b/ecrire/inc/texte_mini.php
index bc2a90a141..a773767ded 100644
--- a/ecrire/inc/texte_mini.php
+++ b/ecrire/inc/texte_mini.php
@@ -292,7 +292,7 @@ function couper($texte, $taille=50, $suite = '&nbsp;(...)') {
 	if (!($length=strlen($texte)) OR $taille <= 0) return '';
 	$offset = 400 + 2*$taille;
 	while ($offset<$length
-		AND strlen(preg_replace(",<[^>]+>,Uims","",substr($texte,0,$offset)))<$taille)
+		AND strlen(preg_replace(",<(!--|\w|/)[^>]+>,Uims","",substr($texte,0,$offset)))<$taille)
 		$offset = 2*$offset;
 	if (	$offset<$length
 			&& ($p_tag_ouvrant = strpos($texte,'<',$offset))!==NULL){
@@ -313,17 +313,17 @@ function couper($texte, $taille=50, $suite = '&nbsp;(...)') {
 	// supprimer les traits, lignes etc
 	$texte = preg_replace("/(^|\r|\n)(-[-#\*]*|_ )/", "\r", $texte);
 
-	// supprimer les tags
-	$texte = supprimer_tags($texte);
-	$texte = trim(str_replace("\n"," ", $texte));
-	$texte .= "\n";	// marquer la fin
-
 	// travailler en accents charset
 	$texte = unicode2charset(html2unicode($texte, /* secure */ true));
 	if (!function_exists('nettoyer_raccourcis_typo'))
 		include_spip('inc/lien');
 	$texte = nettoyer_raccourcis_typo($texte);
 
+	// supprimer les tags
+	$texte = supprimer_tags($texte);
+	$texte = trim(str_replace("\n"," ", $texte));
+	$texte .= "\n";	// marquer la fin
+
 	// corriger la longueur de coupe
 	// en fonction de la presence de caracteres utf
 	if ($GLOBALS['meta']['charset']=='utf-8'){
-- 
GitLab