suppression du code javascript dans la source HTML

suppression du code javascript dans la source HTML - PHP - Programmation

Marsh Posté le 08-06-2006 à 11:06:48    

salut :)
 
en fait je voudrais obtenir une source épurée d'un code source HTML. Dans le genre de ce que fait strip_tags() mais en enlevant le contenu de code javascript... Voici ce que j'ai fait :
 

Code :
  1. $Start = microtime(true) ;
  2. $Data = file_get_contents($_GET['url']) ;
  3. // Epuration du code javascript
  4. $Data = preg_replace('/\b(<script)[.]*(<\/script> )\b/'," ",$Data) ;
  5. // Fin d'épuration JS
  6. echo strip_tags($Data,'<script>') ;
  7. $end = microtime(true );
  8. echo "<br />-----------------------------------------------------------<br />" ;
  9. $ElapsedTime = round(($end - $Start),4) ;
  10. echo "<h1>Temps ecoulé : ".$ElapsedTime." secondes...</h1>" ;


 
Le but est , vous l'aurez compris de supprimer tout ce qui se trouve entre balise <script></script>...
 
Et je galeeeeeeeeeeeeeere !!

Reply

Marsh Posté le 08-06-2006 à 11:06:48   

Reply

Marsh Posté le 08-06-2006 à 11:10:31    

ah.


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 08-06-2006 à 11:13:01    

a mon avis ta regex est foireuse :o

/<script.*?\/script>/gs

Reply

Marsh Posté le 08-06-2006 à 11:19:50    

anapajari a écrit :

a mon avis ta regex est foireuse :o

/<script.*?\/script>/gs



il n'en veut pas , il dit que le "g", il ne connais pas :/
 

Citation :

Warning: preg_replace() [function.preg-replace]: Unknown modifier 'g'


Message édité par the_bigboo le 08-06-2006 à 11:20:39
Reply

Marsh Posté le 08-06-2006 à 11:21:35    

ah oui reflexe perl-istique!!! t'en as pas besoin en php, vire le de la fin mais laisse le s

Reply

Marsh Posté le 08-06-2006 à 11:23:43    

Code :
  1. preg_replace('/<script.*\/script>/'," ",$Data) ;


Ne marche pas non plus

Reply

Marsh Posté le 08-06-2006 à 11:25:02    

laisse le s il t'as dit :sweat:


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 08-06-2006 à 11:26:11    

et il manque le ? :o

Reply

Marsh Posté le 08-06-2006 à 11:28:17    

pas de ? il me faut une * pour que ca tienne compte des <script language="javascript"> et pas <script>uniquement, et ca doit aussi capturer tout ce qu'il y a entre ces balises

Reply

Marsh Posté le 08-06-2006 à 11:33:03    

trouvé... En fait yavait un souci avec les majuscules :sweat:
il fallait falre :

Code :
  1. preg_replace('/<[sS][cC][rR][iI][pP][tT].*\/[sS][cC][rR][iI][pP][tT]>/s'," ",$Data) ;

Reply

Marsh Posté le 08-06-2006 à 11:33:03   

Reply

Marsh Posté le 08-06-2006 à 11:35:52    

bravo!!!
Maintenant en 30 fois plus simple :o

/<script.*?\/script>/si


 
edit: et le point d'intérrogation est nécessaire!!!!
Pourquoi? si tu as le code suivant:
AAA

Code :
  1. <script type="text/javscript">
  2. ...
  3. </script>
  4. du html que tu veux garder
  5. <script type="text/javscript">
  6. ...
  7. </script>
  8. BBB


Ta regex etant greedy, tu vas te retrouver avec:

Code :
  1. AAA
  2. BBB


et non

Code :
  1. AAA
  2. du html que tu veux garder
  3. BBB



Message édité par anapajari le 08-06-2006 à 11:38:38
Reply

Marsh Posté le 08-06-2006 à 12:48:20    

greedy ??
 
PS : effectivement , c'est nettement plus simple :)

Reply

Marsh Posté le 08-06-2006 à 13:17:07    

greedy : les expressions régulieres sont par defaut gourmandes et cherchent a trouver la plus grande chaine de caracteres qui satisfasse le masque de recherche. En PCRE on peut modifier ce comportement pour satisfaire certains types de recherches.
 
ex :
<x>patate</x><x>carotte</x>
 
#<x>(.*)</x># -> match -> "patate</x><x>carotte"
#<x>(.*?)</x># -> match -> "patate" et "carotte", le ? derriere un * ou un + rend celui-ci non gourmand
#<x>(.*)</x>#U -> match -> "patate" et "carotte", l'option U rend les quantificateurs + et *, de l'ensemble du masque, non gourmands


Message édité par afbilou le 08-06-2006 à 13:18:49
Reply

Marsh Posté le 08-06-2006 à 13:19:36    

bon maintenant j'essaie de récupérer le contenu des balises a mais uniquement le lien que contient href...
Pour ce faire , j'ai fait ca :

Code :
  1. preg_match_all("/<a\ href=\"(.*)\">[.]*<\/a>/",$Data,$out, PREG_SET_ORDER) ;


$Data contient du code HTML obtenu par du file_get_conents()
Mais ca ne marque qu'a moitié :/
a chaque fois ca commence au bon endroit mais ca continue au dela du guillement final de href :/


Message édité par the_bigboo le 08-06-2006 à 13:22:19
Reply

Marsh Posté le 08-06-2006 à 13:25:19    

en pcre (je ne sais pas si c'est valable avec les expressions regulieres posix) tous les caracteres perdent leur specialité dans une definition de classe "[]" a l'exception de "]" et de "-".
 
Donc [.]* match une suite de point eventuellement nulle et non pas une suite de caractere car . a perdu sa fonction de caractere jocker.
 
Tu n'as pas non plus d'interet a despecialiser le caractere espace comme tu le fais "\ " ... ca ne sert a rien :s
 

Citation :

a chaque fois ca commence au bon endroit mais ca continue au dela du guillement final de href


C'est typiquement un cas ou tu vas avoir besoin que ton expression reguliere ne soit pas gourmande... et donc utiliser l'option U dans le masque de recherche.


Message édité par afbilou le 08-06-2006 à 13:35:14
Reply

Marsh Posté le 08-06-2006 à 13:28:09    

je rajouterais que le délimiteur de masque peut etre different du caractere "/". Si tu t'amuses a mettre comme délimiteur "#" par exemple ... tu n'es pas obligé de despécialiser le / de la balise a fermante qui se trouve en fin de masque.

Reply

Marsh Posté le 08-06-2006 à 14:31:26    

bon , maintenant j'ai fait :

Code :
  1. preg_match_all("/<a\ href=\"(.*)\">.*<\/a>/",$Data,$out, PREG_SET_ORDER) ;


et voici ce que j'obtiens pour hardware.fr :sweat:
http://img142.imageshack.us/img142/3975/htf2sp.th.jpg
 
....

Reply

Marsh Posté le 08-06-2006 à 14:50:14    

afbilou s'est donné la peine de t'expliquer tout le concept de greedy, accompagné d'exemple plus que parlant, tu aurais au moins pu te donner la peine de le lire... Tu aurais déjà la solution à ton problème [:spamafote]

Reply

Marsh Posté le 08-06-2006 à 15:20:13    

anapajari a écrit :

afbilou s'est donné la peine de t'expliquer tout le concept de greedy, accompagné d'exemple plus que parlant, tu aurais au moins pu te donner la peine de le lire... Tu aurais déjà la solution à ton problème [:spamafote]


je comprends bien, mais ceci ne marche pas non plus :

Code :
  1. preg_match_all("#<a\ href=\"(.*)\">.*</a>#",$Data,$out, PREG_SET_ORDER) ;


quant au masque je n'ai pas tout compris :/ [:spamafote]

Reply

Marsh Posté le 08-06-2006 à 15:26:12    

toutes mes excuses :) je n'avais pas vu le post plus haut :/
j'ai donc fait :

Code :
  1. preg_match_all("#<a href=\"(.*)\">#U",$Data,$out, PREG_SET_ORDER) ;


mais j'ai encore des incohérences du genre :
http://img65.imageshack.us/img65/2272/htf6od.th.jpg

Reply

Marsh Posté le 08-06-2006 à 15:34:47    

normal ta fin de regex c'est une double quote suivi de '>' et dans les exemple que tu surlignes le motif que tu cherches ne correspond pas [:spamafote]

#<a href=(['|"])(.*)\1#U


cela devrait marcher comme tu le désire

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed