Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/07/2008, 15h14   #1
Membre habitué
 
Inscription : octobre 2005
Messages : 641
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 641
Points : 143
Points : 143
Par défaut [PREG_REPLACE] Motif pour gérer l'imbrication de balises HTML

Bonjour à toutes et à tous,

J'aimerais remplacer le contenu du balise HTML précise (par son id) par autre chose.
Malgré mes différentes lectures (tuto+topics) au sujet du remplacement des bouts de chaines via REGEX, je ne m'en sort pas...
Le motif que j'utilise semble fonctionner tant qu'il n'y a pas d'imbrication de balises de même type.

Dans la chaine suivante, j'aimerais remplacer ce qui est en rouge :
Citation:
<div id="id-boite"><p><div id="zzz" class="eee">blabla et <strong>blabla</strong></div></p></div>
Sauf, qu'avec ce motif :
Code :
1
2
3
4
5
6
<?php
$pattern = '#(<div(.*)id="id-boite"(.*)>)(.*)(<\/div>)#U';
$chaine = '<div id="id-boite"><p><div id="zzz" class="eee">blabla et <strong>blabla</strong></div></p></div>';
$remplacement = 'AZERTY';
echo preg_replace($pattern, "$1".$remplacement."$5", $chaine);
?>
affiche :
Citation:
<div id="id-boite">AZERTY</div></p></div>
Mon remplacement s'arrête donc au premier </ div> !

Alors comment remplacer correctement tout le contenu du div ?
Merci d'avance

Tchupacabra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2008, 13h37   #2
Membre du Club
 
Homme Didier Ungar
Développeur Web
Inscription : mars 2006
Messages : 115
Détails du profil
Informations personnelles :
Nom : Homme Didier Ungar
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2006
Messages : 115
Points : 42
Points : 42
Ce n'est pas le plus propre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$pattern = '#(<div(.*)id="id-boite"(.*)>)(.*)(<\/div>)#U';
$chaine = '<div id="id-boite"><p><div id="zzz" class="eee">blabla et <strong>blabla</strong></div></p></div>';
$remplacement = 'AZERTY';
$chaine = preg_replace($pattern, "$1".$remplacement."$5", $chaine);
$old=null;
while ($old !== $chaine){
	$old = $chaine;
	$chaine = preg_replace('#(<div[^>]*>.*)</[^>]*></div>#U', "$1".'</div>', $chaine);
	$chaine = preg_replace('#</div></div>#U', '</div>', $chaine);
}
echo htmlentities($chaine);
?>
Mais tu as le resultat que tu désire :
Code :
<div id="id-boite">AZERTY</div>
DidUngar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2008, 20h32   #3
Membre habitué
 
Inscription : octobre 2005
Messages : 641
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 641
Points : 143
Points : 143
Salut et merci pour ton aide...

cependant, ta méthode ne fonctionne pas complètement.
ex avec un < div > englobant.

demo :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
ini_set('display_error', '1');
$pattern = '#(<div(.*)id="id-boite"(.*)>)(.*)(<\/div>)#U';
$chaine = '<div><div id="id-boite"><p><div id="zzz" class="eee">blabla et <strong>blabla</strong></div></p></div></div>';
$remplacement = 'AZERTY';
$chaine = preg_replace($pattern, "$1".$remplacement."$5", $chaine);
$old=null;
while ($old !== $chaine){
	$old = $chaine;
	$chaine = preg_replace('#(<div[^>]*>.*)</[^>]*></div>#U', "$1".'</div>', $chaine);
	$chaine = preg_replace('#</div></div>#U', '</div>', $chaine);
}
echo htmlentities($chaine);
?>
affiche
Citation:
<div><div id="id-boite">AZERTY</div>
Tchupacabra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2008, 23h51   #4
Membre habitué
 
Inscription : octobre 2005
Messages : 641
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 641
Points : 143
Points : 143
d'après mes recherches, il y a une notion de récursivité (que je ne maîtrise pas) avec les REGEX pour (éventuellement) résoudre mon problème.

Savez vous comment je pourrais m'y prendre ? Un p'tit exemple au moins serait super bienvenue...

Merci d'avance.
Tchupacabra est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h31.


 
 
 
 
Partenaires

Hébergement Web