1

j'essaye de supprimer les "invalidités" d'un fichier html pour pouvoir utiliser le parser xml du php
mon problème : je n'arrive pas à trouver une regex permettant de supprimer la balise "script" et tout son contenu (qui est une grosse source d' "invalidités")
J'ai essaye :
/<SCRIPT[^>]*>[^(<\/SCRIPT>)]*<\/SCRIPT>/
mais ça n'a pas marché (la page pour laquelle j'ai essayé avait les balises "script" en majuscules)

est-ce que vous voyez une solution ?
merci

2

Je dirais :
/\<script[^\>]*\>(?<!\<\/script\>)*\<\/script\>/i
Mais c'est total de mémoire, donc sans garantie
Mon site perso : http://www.xwing.info

3

marchera pas. Tu peux toujours tomber sur un truc comme ça :
[pre]<script language="JavaScript"> <!-- document.alert('//!--></script>'); //--> </script>[pre]C'est pas faisable avec une expression régulière. Parce qu'il te faut une analyse contextuelle.

4

spectras :
marchera pas. Tu peux toujours tomber sur un truc comme ça :
<script language="JavaScript">
<!--
document.alert('//!--></script>');
//-->
</script>

non je ne tomberais pas sur ça pour la bonne raison que tous les browsers se trompent sur cette syntaxe aussi et que par conséquent aucun site n'écrira cette syntaxe (je me rappele qu'avant de connaitre eval() j'avait essaye document.write("</script>") et ça ne marchait pas, il fallait faire document.write("</"+"script>") )

Edit: confirmation, avec
<script>
// </script>
alert(41)
</script>

le browser ecrit "alert(41)"

5

ok, t'as une chance alors happy

6

guilc > non ça marche pas (peut-être dû au PHP, car j'ai une erreur "Compilation failed: nothing to repeat")
merci quand même

7

Si ça utilise des regexp posix (pas gagné), la regexp suivante devrait marcher

[<][Ss][Cc][Rr][Ii][Pp][Tt][^>]*[>][^[.</script>.]]*[<]\/script[>]

8

bon j'ai trouvé une solution
en faisant :
/<SCRIPT[^>]*>.*<\/SCRIPT>/s
ça marche.
Le "s" de fin est important car le "." doit recouvrir les retours à la ligne (jamais compris entre les "\r" et "\n" )
Normalement avec le "m" ça aurait dû marcher (censé traiter la chaîne comme une seule ligne, en 1 seule fois) quelque chose m'échappe

9

ça marche ça ? c'est quoi ton analyseur de regexps pourri ?

Ah attends, ça marche si tu as deux scripts dans la même page ? Le truc devrait normalement de virer tout ce qui est entre le début du premier script et la fin du dernier.

10

merde oui tu as raison ça supprime plusieurs scripts a la fois et ce qu'il y a entre
Si le rajoute le switch qui supprime la casse il reste plus que "</body></html>" à la fin happy

c'est pour ça que ma premiere regex aurait mieux convenu. vais reessayer avec la première.
edit: c'est une des fonctions preg du php

edit2: il m'ait venu une autre idée, ne pas utiliser une regexp, mais 2. Je verrais ça demain (enfin tout à l'heure)

11

J'ai trouvé une alternative : la paresse grin.
Je m'explique : c'est le nom d'une particularité, rajouter un '?' après un '+' ou une '*' de façon à ce que le plus ou l'astérisque n'inclut pas tout
/<SCRIPT[^>]*>.*?<\/SCRIPT>/s
de cette façon, ça marche comme je veux (ok c'est plus lent d'après la page où j'ai vu ça). Je ne sais pas si tous les parsers de regexp supportent cette fonction.

12

Je ne sais pas si tous les parsers de regexp supportent cette fonction.
Probablement pas, parce que c'est une regexp invalide.
[pseudo-edit]Ok, ça marchera toujours avec php, c'est une fonctionnalité de la bibliothèque pcre utilisée par PHP. La documentation dit ça :
Cependant, un quantificateur suivi d'un point d'interrogation cesse d'être gourmand, et au contraire, ne recherche que le nombre minimum de répétition.

Par contre si tu veux porter ton programme dans un autre langage, et que tu utilises pas la même bibliothèque, ça ne marchera plus.

13

J'ai trouvé une autre solution !
/<SCRIPT[^>]*>([^<]|<[^\/]|<\/[^S]|<\/S[^C]|<\/SC[^R]|<\/SCR[^I]|<\/SCRI[^P]|<\/SCRIP[^T]|<\/SCRIPT[^>])*<\/SCRIPT>/
Elle fonctionne !

et si je rajoute le switch i à la fin, apache crashe grin !
je reessayerai ce switch après reboot parce que quand même ...

14

OUIN si j'utilise des minuscules, apache crashe aussi (et il ne me donne pas d'"excuse") mourn
Et si je transformes tous les ø (où ø est une lettre) en [Øø] , apache crashe encore mourn

15

comment ça il crashe ? le serveur ne s'arrête pas non ?

16

le message classique "ce programme va fermer ..." (j'ai apache 1.3 je crois)
Dans les processus, il y a toujours 2 apaches ouverts, quand il crashe, un disparait puis réapparait peu après. A cause du crash, la page n'est pas envoyée.
Edit: est-ce que qqun pourrais essayer et me dire si ça le fait vraiment que chez moi ?

17

Ah, ben le serveur ne crashe pas alors. Seule la partie qui sert ta requête se ferme.