[JS] Strip tags, met uitzondering van valid tags

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Duncank
  • Registratie: December 2007
  • Laatst online: 13-09 22:55
Ik ben bezig met een project waarin ik een complete html-pagina in een variabele heb zitten. (var html)

Ik wil hierin alle tags verwijderen, met uitzondering van <a>-tags en alle afsluitende <p>-tags wil ik vervangen door een <br />.

Ik weet dat ik <p>-openingstags kan replacen met
code:
1
html.replace(/<p>/g,'');

maar de eindtags (</p>) replacen lukt mij niet omdat er een "/" inzit.

Een andere optie die ik gevonden heb is het replacen met behulp van een regular expression:
code:
1
html.replace(/(<([^>]+)>)/g,"");

Deze verwijdert alle tags, maar ik heb begrepen dat het mogelijk is om na de "^" in de expression een set karakters mee te geven waarop hij niet filtert, in mijn geval dus de "p" en de "a". Maar simpelweg die karakters in de expression zetten doet t m niet. Kan iemand mij hierbij helpen?

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Kan iemand mij hierbij helpen?
Nee, het lijkt me handiger dat je zelf leert hoe je het moet oplossen...

Een aantal tips:
- Ja je kan wel replacen met een / (zoek maar op javascript escaping characters)
- Het klinkt alsof je alleen content eruit wilt halen, waarom ga je strippen als je juist alleen bepaalde info wilt ophalen (veel logischer omdat je dan zelf bepaald wat je met de content doet ;))
maar ik heb begrepen dat het mogelijk is om na de "^" in de expression een set karakters mee te geven waarop hij niet filtert, in mijn geval dus de "p" en de "a". Maar simpelweg die karakters in de expression zetten doet t m niet.
Kom maar op met je testcase en probeer even uit te vogelen hoe je het dan wel met ^ kan doen ;)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Duncank
  • Registratie: December 2007
  • Laatst online: 13-09 22:55
BtM909 schreef op dinsdag 20 september 2011 @ 18:31:
[...]

Nee, het lijkt me handiger dat je zelf leert hoe je het moet oplossen...

Een aantal tips:
- Ja je kan wel replacen met een / (zoek maar op javascript escaping characters)
- Het klinkt alsof je alleen content eruit wilt halen, waarom ga je strippen als je juist alleen bepaalde info wilt ophalen (veel logischer omdat je dan zelf bepaald wat je met de content doet ;))
...
Bedankt voor je antwoord!

Ik ben al bezig geweest met het escapen van karakters met javascript;
code:
1
html.replace(/%3C%2Fp%3E/g,'<br />');
doet t m echter ook niet.
Naar een werkende oplossing voor het gebruik van ^ zoek ik nog door..

Acties:
  • 0 Henk 'm!

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Rare vraag misschien, maar mis je sowieso niet de single-quotes in je wat je wil vervangen?

html.replace('blah', 'iets anders');

Ik mis de quotes om de blah bij jou

Je gaat teskt met tekst vervangen, niet een variable gevult met tekst.

Ey!! Macarena \o/


Acties:
  • 0 Henk 'm!

  • PeterSelie
  • Registratie: December 2002
  • Laatst online: 27-08 11:55
RaZ schreef op dinsdag 20 september 2011 @ 18:48:
Rare vraag misschien, maar mis je sowieso niet de single-quotes in je wat je wil vervangen?

html.replace('blah', 'iets anders');

Ik mis de quotes om de blah bij jou

Je gaat teskt met tekst vervangen, niet een variable gevult met tekst.
Neen, hij maakt gebruik van een regex replace en gebruikt de slash als start- en eindkarakter voor zijn regex.

[ Voor 63% gewijzigd door PeterSelie op 20-09-2011 18:52 ]


Acties:
  • 0 Henk 'm!

  • Duncank
  • Registratie: December 2007
  • Laatst online: 13-09 22:55
RaZ schreef op dinsdag 20 september 2011 @ 18:48:
Rare vraag misschien, maar mis je sowieso niet de single-quotes in je wat je wil vervangen?

html.replace('blah', 'iets anders');

Ik mis de quotes om de blah bij jou

Je gaat teskt met tekst vervangen, niet een variable gevult met tekst.
Volgens mij niet; volgens deze link zou het zo moeten: http://www.w3schools.com/jsref/jsref_replace.asp

Ik gebruik de methode met /g om alles te vervangen, en niet alleen de eerste match.

Acties:
  • 0 Henk 'm!

  • PeterSelie
  • Registratie: December 2002
  • Laatst online: 27-08 11:55
@Duncank: Kuch kuch

Je interpreteerd de term ´karakter-escaping´ verkeerd. Je zal moeten zoeken naar het escapen van speciale karakters binnen regex in plaats van het encoden van deze karakters dat je nu probeerd. De slash binnen de tag zal je moeten replacen met een backslash, aangezien je gebruik maakt van slashes als start- en eindkarakter van je regex.

Acties:
  • 0 Henk 'm!

  • Duncank
  • Registratie: December 2007
  • Laatst online: 13-09 22:55
SoaDmaggot schreef op dinsdag 20 september 2011 @ 18:52:
@Duncank: Kuch kuch

Je interpreteerd de term ´karakter-escaping´ verkeerd. Je zal moeten zoeken naar het escapen van speciale karakters binnen regex in plaats van het encoden van deze karakters dat je nu probeerd. De slash binnen de tag zal je moeten replacen met een backslash, aangezien je gebruik maakt van slashes als start- en eindkarakter van je regex.
thanks! Wel vreemd, want ik zou zweren dat ik m al eens getest had; maar het werkt!

code:
1
html = html.replace(/<\/p>/g,'<br />');
doet wat ie moet doen.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

kun je de html niet beter in off-DOM node gooien en dan dat stuk (geheel of gedeeltelijk) platslaan? Je moet dan nog wel eerst tags eruit slopen waarvan je zéker weet dat ze moeilijkheden kunnen geven (zoals <style>, <script>, <iframe>, <object>, en wrs nog wel een paar). Maar daarna kun je op een betrouwbare manier door de nodes wandelen.

jQuery maakt het zelfs helemaal makkelijk voor je: met de functie unwrap() die je toepast op tags die je "weg" wil hebben (die je dus wilt platslaan).

日本!🎌


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
_Thanatos_ schreef op woensdag 21 september 2011 @ 00:27:
Je moet dan nog wel eerst tags eruit slopen waarvan je zéker weet dat ze moeilijkheden kunnen geven (zoals <style>, <script>, <iframe>, <object>, en wrs nog wel een paar).
Niet blacklisten, whitelisten! Gewoon <a>, <p>, <br> en <hr> (en weet ik het) toestaan, de rest wegmikkeren. En dan nog loop je 't gevaar dat er geinponems <p onmouseover="doSomethingScary();"> gebruiken dus ook attributen whitelisten. En dan nog verdomdes oppassen dat je bijv. geen <img src="javascript:doSomethingScary();"> e.d. 'door laat'.

De lijst die je opnoemt krijg je namelijk never-ever compleet / goed. Zo mis ik nu al (bijv) <applet>, <embed>, <frame>, <frameset>, <link>, <ilayer>, <meta>, <object> (niet dat je pretendeerde compleet te zijn, ik probeer een indruk te geven). En dan ben je er nog niet en dan heb je nog de attributen etc. etc.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Uit het topic is op te maken dat je al clientside bezig bent, dus waarom zou je in hemelsnaam met regexen gaan lopen modderen wanneer je ook gewoon een DOM fragment kunt maken van je string en daar dan gestructureerd je tags uit kunt slopen of in kunt muteren.

In het simpelste geval kun je met jQuery iets doen zoals het volgende:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function stripContent(html)
{  
  var fragment = $(html);

  // Unwrap all elements that are not <a> or <p> tags.
  fragment.find(":not(a, p)").unwrap();

  // Unwrap <p> tags and add trailing <br /> tag.
  fragment.find("p").after("<br />").unwrap();

  // Append the fragment to a container and read back its inner HTML
  // to get a string representation of the stripped content.
  return $("<div></div>")
    .append(fragment)
    .html();
}

  • rednek
  • Registratie: Juli 1999
  • Laatst online: 01-09 17:44
Volgens mij zoek je gewoon iets zoals dit. http://phpjs.org/functions/strip_tags:535

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Dan mis je nog alle ongewilde (javascript) attributen op de wél toegestane tags!

Koop of verkoop je webshop: ecquisition.com


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

RobIII schreef op woensdag 21 september 2011 @ 01:41:
[...]

Niet blacklisten, whitelisten! Gewoon <a>, <p>, <br> en <hr> (en weet ik het) toestaan, de rest wegmikkeren. En dan nog loop je 't gevaar dat er geinponems <p onmouseover="doSomethingScary();"> gebruiken dus ook attributen whitelisten. En dan nog verdomdes oppassen dat je bijv. geen <img src="javascript:doSomethingScary();"> e.d. 'door laat'.

De lijst die je opnoemt krijg je namelijk never-ever compleet / goed. Zo mis ik nu al (bijv) <applet>, <embed>, <frame>, <frameset>, <link>, <ilayer>, <meta>, <object> (niet dat je pretendeerde compleet te zijn, ik probeer een indruk te geven). En dan ben je er nog niet en dan heb je nog de attributen etc. etc.
Je mist m'n hele punt. De blacklisted elementen zijn elementen die iets kunnen uitvreten *zodra* ze als node worden aangemaakt/ingeprikt worden. Events vuren niet af op nodes die buiten die DOM hangen. De elementen die overblijven, hang je dus in een node *buiten* de DOM, zodat je er doorheen kan wandelen en alleen de dingen behouden die toegelaten worden.

Dit is dus een alternatief voor het whitelisten met regexes, die hoe dan ook toch altijd een beetje labiel aanvoelen voor dit soort dingen. En ook regexes kunnen security issues hebben als ze vreemde low- of high-ascii karakters gaan matchen met de "." operator. Als je de html in een off-DOM node hangt, heb je een duidelijk tree die eenduidig benaderbaar is, en waar je uit weg kan slopen wat je weg wil slopen, op een manier die *altijd* goed gaat.

日本!🎌


  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
_Thanatos_ schreef op donderdag 22 september 2011 @ 12:58:
[...]

Als je de html in een off-DOM node hangt, heb je een duidelijk tree die eenduidig benaderbaar is, en waar je uit weg kan slopen wat je weg wil slopen, op een manier die *altijd* goed gaat.
QFT.

Mensen moeten eens ophouden te denken dat complexe problemen zoals DOM traversal met een paar korte regexen op te lossen zijn. Kijk alleen al naar de idioot grote regex die je nodig hebt om zoiets simpels als een e-mail adres (bijna) correct te valideren.
Pagina: 1