Problème regexp pour parser fichier html


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8578
Inscription: 23 Nov 2005

Problème regexp pour parser fichier html

Message le Jeu Déc 28, 2006 9:54

Bonjour à tous !

Mon souci du jour à trait au parsage d'une page html de mon site afin de la nettoyer pour ensuite la générer sous un autre format.

J'utilise le code suivant pour détecter la balise <SCRIPT langage="javascript">, mais le souci c'est que dans ma page j'ai plusieurs fois des <SCRIPT langage="javascript"></SCRIPT>, et mon code me récupère ce qui est contenu entre la première balise <SCRIPT langage="javascript"> et la dernière balise </SCRIPT>. Bien dommage vu que c'est a peu près tout mon fichier qui est ainsi récupéré...

Le code utilisé :
Code: Tout sélectionner
if (eregi("<SCRIPT language=javascript>(.*)</SCRIPT>", $buffer, $regs))
{
   echo "<pre>";
   print_r($regs);
   echo "</pre>";
}


le but est donc de récupérer le contenu du premier couple <SCRIPT langage="javascript"></SCRIPT> en vue de le supprimer de la variable qui contient l'ensemble du code html de mon fichier.

Si quelqu'un sait où mon expresssion regulière foire, je suis preneur :-)

edit : A priori si j'essaie d'autres regexp sur d'autres balises html, le problème posé est le même: il prends la première occurence de la balise ouvrante et la dernière occurence de la balise fermante.


Leonick
WRInaute accro
WRInaute accro
 
Messages: 19595
Inscription: 8 Aoû 2004

Message le Jeu Déc 28, 2006 10:26

if faut remplacer le (.*) par ([^<]*), comme cela il capturera tout ce qui ne contient pas de < et il ne prendra qu'un seul contenu :wink:


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8578
Inscription: 23 Nov 2005

...

Message le Jeu Déc 28, 2006 11:58

..merci Leonick ca fonctionne bien :-)

Par contre, en appliquant ce modèle de script cela ne fonctionne pas si on a des balises imbriquées (ce qui est justement mon cas).

Genre si je veux récupérer le tableau d'id tab dans une page html, et uniquement ce tableau là :

Code: Tout sélectionner
<html>
<table id="tab">
<tr><td></td>
<td></td><tr>
</table>
<table id="tab2">
<tr><td></td>
<td></td><tr>
</table>
</html>


Et là le pattern appliqué plus haut ne peut plus s'appliquer.


julienr
WRInaute impliqué
WRInaute impliqué
 
Messages: 913
Inscription: 5 Aoû 2003

Message le Jeu Déc 28, 2006 12:17

dans ton cas alors les regexp ne sont pas adapté, c'est plus du parsing de fichier html que tu veux faire et donc je te conseil htmlparser qui devrait etre aussi plus rapide qu'une regexp complexe
http://htmlparser.sourceforge.net/
:)


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8578
Inscription: 23 Nov 2005

...

Message le Jeu Déc 28, 2006 14:01

... en fait je voulais justement eviter de passer par un script tiers (ici du perl) pour faire cela.

C'est donc difficilement gérable de récupérer via les expressions régulières une portion de html avec des balises imbriquées sur un modèle de ce genre :

Code: Tout sélectionner
<html>
<table id="tab">
<tr><td></td>
<td></td><tr>
</table>
<table id="tab2">
<tr><td></td>
<td></td><tr>
</table>
</html>


julienr
WRInaute impliqué
WRInaute impliqué
 
Messages: 913
Inscription: 5 Aoû 2003

Message le Jeu Déc 28, 2006 14:38

le plus maintenable et perf reste cette solution à mon avis
http://php-html.sourceforge.net/ je mettais trompé de lien :(
celui ci est bien en php

Tilt
WRInaute impliqué
WRInaute impliqué
 
Messages: 858
Inscription: 26 Mar 2005

Message le Jeu Déc 28, 2006 16:51

pour ta 2ème question (tableaux imbriqués), tu pourrais essayer avec "preg_match":

$a=preg_match("`<table id=\"tab\">(.*)</table>`i",$variable_a_parser,$out)?$out:false;

ou :

$a=preg_match_all("`<table id=\"tab\">(.*)</table>`i",$variable_a_parser,$out)?$out:false;

Les 2 te renvoient un tableau $a, affiche-le avec:
echo"<pre>";print_r($a);echo"</pre>";

et fais ton choix ...

Et pour enlever les balises script et leur contenu:
$a=preg_replace("`<script[^<]+</script>`i","",$variable_a_parser);


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités