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("'", "'", end($reg))); + break; } - $att = filtrer_entites(str_replace("'", "'", $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