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 10/04/2006, 15h35   #1
Invité de passage
 
Inscription : janvier 2005
Messages : 12
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 12
Points : 2
Points : 2
Par défaut Supprimer les balises <DIV *>

Bonjour,

Voila je me galère avec les expressions regulières. J'ai cherché sur le forum mais j'ai pas trouver ma soluce
En fait je cherche a supprimer toutes les balises DIV et SPAN dans une chaine de caractère mais je ne sais pas comment faire.

Les balises DIV et SPAN commencent toutes par :
<DIV kelkechose> ou <SPAN kelkechose>
et se terminent toutes par </DIV> ou </SPAN>

En fait je me galère surtout pour le kelkechose

J'ai essayer un truc comme ça mais ça marche pas, et tpout cause me direz vous
Code :
$html = preg_replace("<div|span.+[^>]>", "NADA", $aTEST[$i]['CHAPEAU']);
En fait je comprends rien aux expressions regulières. Au secours !

Merci
deloo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2006, 18h28   #2
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Il faut bien voir que les fonctions preg_() ont besoin de délimiteurs de ton expression. Pourquoi ? Simplement car cela te permet de spécifier des modificatuers après ton expression.
Un très grand nombre de caractères peut servir de délimiteur en PHP. Ici, j'imagine que PHP a pris "<" et ">" pour délimiter ton expression, ce qui fait qu'ils ne sont pas contenus dans le masque réel.

Voici ce que je te propose :
Code :
'#<(?:div|span)[^>]*>.*</(?:div|span)>#Usi'
Le souci avec ce genre de trucs est qu'il va aussi remplacer <div>bouh</span>...
Je te recommande de le faire en deux fois (une DIV et une SPAN).
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2008, 16h25   #3
Membre du Club
 
Inscription : mars 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 120
Points : 42
Points : 42
Envoyer un message via MSN à sculpteur
Par défaut sculpteur

Yogui
est ce que votre code marche avec php 4.*?
car j'ai eu l'erreur suivante:
Code :
1
2
 
Warning: eregi_replace(): REG_BADRPT in h:\program files\easyphp1-8\www\sup_tags\sup_tags.php on line 12
merci d'avance
sculpteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2008, 19h04   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
C'est une syntaxe PCRE (Perl Compatible Regular Expressions) donc valable uniquement avec les fonctions de l'extension éponyme (fonctions preg_*). Il serait bon de prendre note du caractère "obsolète" des fonctions dites POSIX (ereg*) : elles ne sont pas aussi performantes et souples que les autres et ne font plus partie du core.

Et au cas où : Initiation aux expressions régulières en PHP

(j'oubliais de préciser que ces fonctions PCRE n'ont pas de pré-requis quant à la version de PHP)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2008, 10h55   #5
Membre du Club
 
Inscription : juin 2003
Messages : 83
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 83
Points : 47
Points : 47
Citation:
Envoyé par Yogui Voir le message
Salut

Il faut bien voir que les fonctions preg_() ont besoin de délimiteurs de ton expression. Pourquoi ? Simplement car cela te permet de spécifier des modificatuers après ton expression.
Un très grand nombre de caractères peut servir de délimiteur en PHP. Ici, j'imagine que PHP a pris "<" et ">" pour délimiter ton expression, ce qui fait qu'ils ne sont pas contenus dans le masque réel.

Voici ce que je te propose :
Code :
'#<(?:div|span)[^>]*>.*</(?:div|span)>#Usi'
Le souci avec ce genre de trucs est qu'il va aussi remplacer <div>bouh</span>...
Je te recommande de le faire en deux fois (une DIV et une SPAN).
Bonjour,

petite question sur ta regexp :

En fait, j'ai le même problème que deloo mais après avoir suivi le cours sur ce site, je suis arrivé à ça :

Code :
'#<font(.*)>(.*)</font>#Usi'
Ce qui fonctionne très bien. En conséquence de quoi je ne vois pas l'utilité de la séquence [^>]* dans l'exemple de Yogi ?

Edit : en fait j'ai compris : [^>]* veut dire : "tous les caractères (de 0 à n pour la quantité) sauf le >"

"?:" : kezako ? Après moulte recherche (car l'explication du tuto n'est pas très claire, j'ai trouvé à http://www.expreg.com/optimisation.php :


Citation:
Dans la mesure du possible, si vous ne devez pas capturer certaines parties de votre masque, rendez vos parenthèses (alternative) non capturante.
Dans le masque de l'exemple ci-dessus, vous remarquerez que je l'ai fait grâce à ?:
comme ceci : '`(p(?:a|i|o)f)`i'
En faisant comme cela, vous allégez la charge de moteur de regex et vous rendez vos regex plus rapide.
Ensuite, je ne veux pas supprimer la chaine entre balise FONT, il faut donc que je trouve la soluce. Je continue à chercher pour ce second point.

Edit : J'ai trouvé pour ça aussi : je fais :
Code :
1
2
$pattern='#<font(.*)>(.*)</font>#Usi' ;
preg_replace($pattern,"$2", $string);
En gros, la partie comprise au niveau de la 2ème parenthèse capturante sert de chaine de remplacement.

merci
à+
kileak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2008, 20h08   #6
Membre du Club
 
Inscription : juin 2003
Messages : 83
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 83
Points : 47
Points : 47
Re,

J'ai une autre question en rapport avec les expressions régulières et l'appel de preg_replace.

En gros, en faisant comme suit :

Code :
1
2
3
4
$pattern = "#<span[^>]*>(.*)</span>#Usi";
$string = '<span align="test>texte n°1 <span>PARTIE 2</span> fin texte 1</span> <span>ZONE 3</span>' ;
$string = preg_replace($pattern,"$1", $string);
$string renverra :

Citation:
texte n°1 <span>PARTIE 2 fin texte 1</span> ZONE 3
En clair, la première ouverture de SPAN et la première fermeture seront éliminées.
Vu que je veux éradiquer les SPAN, je dois faire une boucle :

Code :
1
2
while (preg_match($pattern, $string))
   $string = preg_replace($pattern,"$1", $string);
La question qui en découle est donc la suivante :existe-t-il une regexp qui face ça et si oui laquelle ?
Si déjà je suis dedans autant aller jusqu'au bout de l'apprentissage

Je vous remercie !

à+
kileak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2008, 14h11   #7
Membre du Club
 
Inscription : mars 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 120
Points : 42
Points : 42
Envoyer un message via MSN à sculpteur
Bonjour
-cela supprime les balises div:
$chaine = preg_replace("@</?div[^>]*?>@si", '', $chaine);
-et celui là supprime les balises div avec leur contenu
$chaine = preg_replace("@<div[^>]*?>.*?</div>@si", '', $chaine);


mais la 2eme ne fonctionne pas tout le temps et je crois c'est parce que qu'elle n'inclut pas quelques caractères spéciaux.
sculpteur 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 19h02.


 
 
 
 
Partenaires

Hébergement Web