From 432ac6406a9f6934c5feca4bcadf792a59329d10 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Mon, 22 Jan 2007 16:57:00 +0000
Subject: [PATCH] extraire_atribut qui va mieux ? (passe tous les tests en tout
 cas ...)

---
 ecrire/inc/filtres.php | 42 ++++++++++++++++++++++--------------------
 1 file changed, 22 insertions(+), 20 deletions(-)

diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index b69372fa85..059764289c 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -1189,28 +1189,30 @@ function extraire_tag($texte, $tag) {
 // ($complet demande de retourner $r)
 // http://doc.spip.org/@extraire_attribut
 function extraire_attribut($balise, $attribut, $complet = false) {
-	if (preg_match(
-//	',(.*?<[^>]*)(\s'.$attribut.'=\s*([\'"]?)([^\\3]*?)\\3)([^>]*>.*),isS',
-	',(.*?<(?:\s*+\w++(?:=(?:"[^"]*"|\'[^\']*\'|[^\'"]\S*))?)*?)(\s+'.$attribut.'(?:=\s*("[^"]*"|\'[^\']*\'|[^\'"]\S*))?)()([^>]*>.*),isS',
-	$balise, $r)) {
-		if ($r[3][0] == '"' || $r[3][0] == "'") {
-			$r[4] = substr($r[3], 1, -1);
-			$r[3] = $r[3][0];
-		} elseif ($r[3]) {
-			$r[4] = $r[3]; 
-			$r[3] = '';
-		} else {
-			$r[4] = trim($r[2]); 
+	$value = NULL;
+	$attribut = strtolower($attribut);
+	// on ne prend que la premiere balise qui se presente
+	if (!preg_match("{<([a-z]*)([^>]*?)>}is",$balise,$regs))
+		return $value;
+	$tagname = $regs[1];
+	$balise = $regs[2];
+
+	// 3 types d'attributs : valeur sans guillemets, entre guillemets ou quote, ou autodefinis (sans valeur)
+	preg_match_all(',(([a-z]+)((\s*=\s*([^\s\'"]+))|(\s*=\s*([\'"]?)([^\\7]*?)\\7)|\s)),isS',$balise,$regs,PREG_SET_ORDER);
+	
+	foreach($regs as $reg){
+		if ($attribut==strtolower($reg[2])){
+			$value = $reg[2];
+			$att_complet = $reg[0];
+			if (count($reg)>4) // ca n'est pas une entite auto definie
+				$value = filtrer_entites(str_replace("&#39;", "'", end($reg)));
+			break;
 		}
-		$att = filtrer_entites(str_replace("&#39;", "'", $r[4]));
 	}
-	else
-		$att = NULL;
-
 	if ($complet)
-		return array($att, $r);
+		return array($value, $att_complet);
 	else
-		return $att;
+		return $value;
 }
 
 // modifier (ou inserer) un attribut html dans une balise
@@ -1226,11 +1228,11 @@ function inserer_attribut($balise, $attribut, $val, $texte_backend=true, $vider=
 	else
 		$insert = " $attribut='$val' ";
 
-	list($old, $r) = extraire_attribut($balise, $attribut, true);
+	list($old, $att_complet) = extraire_attribut($balise, $attribut, true);
 
 	if ($old !== NULL) {
 		// Remplacer l'ancien attribut du meme nom
-		$balise = $r[1].$insert.$r[5];
+		$balise = str_replace($att_complet,$insert,$balise);
 	}
 	else {
 		// preferer une balise " />" (comme <img />)
-- 
GitLab