[Regexp/Ruby] Javascript uit HTML halen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
Ik heb een HTML-string en wil daar alle javascript uit halen. Dus in feite de script tags en alles wat daar tussen zit. Ik programmeer het in Ruby, maar vraag me af of daar het probleem zit. Mijn gevoel zegt dat het in de regexp zit.

Ik heb het even getest met wat random shit en dat werkt:
code:
1
2
s1 = "<script text=>aa</script>adf<script text=>dg<\/script>"
s1.gsub(/<script(.*?)<\/script>/, "") # "adf"


Maar de echte HTML wil niet lukken....
Hieronder een gedeelte van de HTML (hele pagina posten zal niet gewaardeerd worden) :P
Sorry voor de nogal 'troeperige string'
code:
1
s = "<script type=\"text/javascript\">\n                    // Google Adsense for Search Javascript API\n                    var google_afs_request_done_executed = false;\n\n                    google_afs_query = 'nike Kleding | Heren';\n                    google_afs_ad = 'w0n8';  // specify the number of ads you are requesting\n                    google_afs_adpage = '1';  // page number\n                    google_afs_client = 'marktplaats';  // substitute your client ID\n                    google_afs_channel = 'marktplaats,View_list,L1,1776,t5,t8,n921,h822,x603'; // enter your comma-separated channel IDs\n                    google_afs_ie = 'ISO-8859-1';      // select input encoding scheme\n                    google_afs_oe = 'ISO-8859-1';      // select output encoding scheme\n                    google_afs_adsafe = 'high';  // specify level for filtering non-family-safe ads\n                    google_afs_adtest = 'off'; // set parameter to off before launch to production\n                    google_afs_hl = 'nl';      // enter your interface language if not English\n                    google_afs_gl = 'NL';      // Country\n\n                    function google_afs_request_done(google_ads) {\n                        \n                        if (google_ads.length <= 0) {\n                            return;\n                        }\n                        google_afs_request_done_executed = true;\n                        google_ad_request_done(google_ads);\n                    }\n                    </script>\n                    <script type=\"text/javascript\" src=\"http://www.google.com/afsonline/show_afs_ads.js\">\n                    </script>\n                    <script type=\"text/javascript\">\n                    if ( !google_afs_request_done_executed ) {\n                        // No data; Fall back to AFC script\n                        google_ad_client = 'ca-marktplaats_xml';\n                        google_ad_channel = 'marktplaats,View_list,L1,1776,t5,t8,n921,h822,x603,afs_fallback';\n                        google_ad_output = 'js';\n                        google_max_num_ads = '8';\n                        google_language = 'nl';\n                        google_safe = 'high';\n                        google_adtest = 'off';\n                    }\n                    </script>\n                    <script type=\"text/javascript\" src=\"http://pagead2.googlesyndication.com/pagead/show_ads.js\"></script>\n                \n            \n    \n    </body>\n</html>\n"

Als ik doe 's.gsub(/<script(.*?)<\/script>/, "")' krijg ik alle HTML terug inclusief script-tags

edit:

Ik heb dit geprobeerd, dat werkt wel, maar is voor dfe rest van mijn pagina weer juist TE rigureus: http://house9.blogspot.co...o-remove-script-tags.html
Dit gooit er ook veel HTML uit naast alleen maar de script-tags

[ Voor 3% gewijzigd door van.der.schulting op 07-06-2011 15:12 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 22:52

MueR

Admin Tweakers Discord

is niet lief

Ik gooi deze even over de schutting naar Programming

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Ik hoop dat je je realiseert dat je op deze manier alleen maar script tags gaat verwijderen, dat is niet alle javascript. Vergeet alle "onLoad", "onClicK" etc. attributen niet.

Ik ben niet thuis in Ruby, maar zou het probleem de newlines kunnen zijn? Die zie ik niet terug in je kleine test en wel in the tweede string.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dit klinkt inderdaad als iets dat je met de DOTALL modifier fixt in andere talen. Geen idee of Ruby die ook kent.

edit:
Ja dus: http://www.regular-expressions.info/ruby.html. Gewoon /m.

[ Voor 25% gewijzigd door NMe op 07-06-2011 16:20 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 01:32

alienfruit

the alien you never expected

Er is geen htmlpurifier variant voor Ruby die boel opschoont voor je?

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Zoals met alle security, gebruik liever whitelisting dan blacklisting; kortom: alleen dingen toestaan waarvan je zeker weet dat het geen ellende oplevert. Als je nu al niet aan html event attributen denk, dan heb je ook vast nog niet aan object en embed gedacht, laat staan behaviours in styles enz, enz. Je bent dan eigenlijk een heel groot gat in een dijk dicht aan het tapen bent met niet eens genoeg tape.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Sowieso lijkt het me geen goed idee om HTML-bewerkingen te doen met reguliere expressies.

Beter is een DOM-parser te gebruiken, en dan alle nodes langs te lopen.

Acties:
  • 0 Henk 'm!

  • messi
  • Registratie: Oktober 2001
  • Laatst online: 20-09 18:52
Kijk eens naar de sanitize gem (https://github.com/rgrove/sanitize). Deze maakt gebruik van Nokogiri (een echte html parser) en is een stuk robuuster dan je regex.

Onze excuses voor het ontbreken van de ondertiteling.


Acties:
  • 0 Henk 'm!

  • Hoogie2004
  • Registratie: Mei 2005
  • Laatst online: 20-09 10:53

Hoogie2004

Whohooooo

Rekcor schreef op woensdag 08 juni 2011 @ 10:04:
Sowieso lijkt het me geen goed idee om HTML-bewerkingen te doen met reguliere expressies.

Beter is een DOM-parser te gebruiken, en dan alle nodes langs te lopen.
+1

Klassiek voorbeeld waarvoor regex eigenlijk niet bedoeld is (html parsen)

My iRacing profile | Strava


Acties:
  • 0 Henk 'm!

  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
Thanks voor alle replies, maar uiteindelijk bleek dat ik de oplossing in de verkeerde hoek zocht. Ik had namelijk het idee dat ik een bug tegenkwam in Nokogiri en wilde het daarom zo 'basic' oplossen.

Anyhow, uiteindelijk kon ik gewoon Nokogiri gebruiken voor wat ik wilde ;)

BTW die Santize is er ook eentje om te onthouden. Zie niet direct waar ik hem kan gebruiken, maar wat ' ie kan ziet er wel goed uit ;)
Pagina: 1