Toon posts:

[Java]Regex: verwijder alle html tags, behalve...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Argh,

ik kom er eventjes niet meer uit. Ik krijg uit een xml bestand een berg tekst aangeleverd waar een hoop html opmaak in staat (gegenereerd door onder andere ms-word). Ik wil die zooi er uit hebben, op vier tags na. De br tag wordt vervangen door een newline (werkt prima) en verder moeten de bold, italic en understrike tags blijven staan...

Wat ik nu doe is het volgende:
[code=java]
Pattern removeHTML = Pattern.compile(tags[i], Pattern.CASE_INSENSITIVE & Pattern.UNICODE_CASE);
Matcher matcher = removeHTML.matcher(text);

StringBuffer noHTML = new StringBuffer();
while(matcher.find())
matcher.appendReplacement(noHTML, replacements);
matcher.appendTail(noHTML);
text = noHTML.toString();
[/code]

Mijn regex pattern voor de tags is: "<
?[^bui>]*>" (er gaat iets mis met de opmaak :?)

Helaas worden nu tags als <b> en dergelijke toch verwijderd, terwijl tags als <font size=2> blijven staan :( Ik heb de sun documentatie doorgelezen. Volgens mij zou [^bui>] betekenen, alles buiten b, u, i en >. Helaas dus niet. Wat gaat er fout in mijn redenatie?

Ohja, ik werk dus met de nieuwste jdk, met j2se 1.5.0_4 java.util.regex.*; package... Ik neem toch aan dat dat voldoende zou moeten zijn.

[ Voor 9% gewijzigd door Verwijderd op 30-08-2005 15:15 . Reden: Extra informatie m.b.t. de java omgeving ]


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Volgens mij zou [^bui>] betekenen, alles buiten b, u, i en >.
Dat klopt.
Mijn regex pattern voor de tags is: "<[/]?[^bui>]*>"
== <, gevolgd door optionele /, gevolgd door 0 of meer characters buiten b, u, i en > en als laatste een >.
<font size=2>
Er zit een i in. Matcht daarom niet.
<b>
Ik snap ook niet waarom hij verdwijnt.

[ Voor 37% gewijzigd door Daos op 30-08-2005 14:47 . Reden: er stond [/] tussen ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Zou je pattern niet:
<[^bui][^>]*>
of iets dergelijks moeten zijn?
Op deze manier match je sowieso alleen maar tags, terwijl jouw pattern ook in "a>b" het "a>" zou matchen.

Het is een ongetest voorstel, maar dit lijkt me toch te moeten werken.

[ Voor 11% gewijzigd door bigbeng op 30-08-2005 14:34 ]


Verwijderd

Misschien overbodig, maar ik zet m toch even neer:

http://www.regular-expressions.info/

Als je daar zoekt zou je wel een andere (betere) oplossing kunnen vinden door bijvoorbeeld de cases expliciet te definieren en dan met een of operator matchen.

Dat gezegd hebbende, ik zie zo 1 2 3 ook niet waarom die <b> fout gaat, dat van font size klopt wat werd gezegd.

Edit: waarom trouwens een optional < (de ? in je regexp) in je regexp?

[ Voor 10% gewijzigd door Verwijderd op 30-08-2005 14:42 ]


Verwijderd

Topicstarter
bigbeng schreef op dinsdag 30 augustus 2005 @ 14:34:
Zou je pattern niet:
<[^bui][^>]*>
of iets dergelijks moeten zijn?
Op deze manier match je sowieso alleen maar tags, terwijl jouw pattern ook in "a>b" het "a>" zou matchen.

Het is een ongetest voorstel, maar dit lijkt me toch te moeten werken.
Helaas, nu worden gewoon alle tags verwijderd, ook de <b> bijvoorbeeld. :(

Als je uitschrijft wat het pattern zou moeten doen dan lijkt het allemaal vrij simpel. Dit luidt: "Verwijder alles tussen de haakjes <...> indien het geen b, u of i is, eventueel voorgegaan door een /.". Maar de omzetting middels de syntax van de patterns die beschreven staan in de sun java docs lukt mij niet... Wellicht een verkeerde benadering van het probleem?

Verwijderd

Probeer anders ook eens je < en > te escapen, in sommige varianten wordt dit volgens mij gebruikt om variabelen oid op te slaan.

  • Standeman
  • Registratie: November 2000
  • Laatst online: 23:12

Standeman

Prutser 1e klasse

Heb je misschien niet direct wat aan, maar als je vaker moet regexp-en dan kan je het beste hier naar kijken Apache RegExp

Er zit een applet bij voor de debuggen van je regular expression :*)

The ships hung in the sky in much the same way that bricks don’t.


Verwijderd

Hmmm, lijkt me toch iets met verkeerd aanroepen oid hoor. In die applet werkt het precies zoals verwacht. Blijft trouwens nog steeds een minder dan ideale oplossing aangezien je dan alle tags beginnend met een b u of i laat staan. Kan vervelend uitpakken als je echt alleen <b> <u> en <i> wil, aangezien <ul> bijvoorbeeld blijft staan

[ Voor 53% gewijzigd door Verwijderd op 30-08-2005 14:52 ]


  • mocean
  • Registratie: November 2000
  • Laatst online: 30-03 18:32
Geen oplossing, maar een tool, deze gebruik ik altijd: http://www.weitz.de/regex-coach/
Daarin kan je heel goed regexen testen.

Afbeeldingslocatie: http://www.weitz.de/regex-coach/shot.gif

Koop of verkoop je webshop: ecquisition.com


  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 16:03

Salandur

Software Engineer

als je echt alleen <b><i> en <u> wilt hebben:
</?(b|i|u)(>| .*?>)

dit matched:
<b> </b> <b class=...>
hetzelfde voor de rest.

het gaat ook om de spatie tussen | . omdat je zo een spatie toestaat voor attribvuten

Assumptions are the mother of all fuck ups | iRacing Profiel


  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Een andere aanpak:
- Vervang eerst alle tags die je wilt overhouden door iets wat niet op een HTML-tag lijkt (bijv. door de vishaken te vervangen door spekhaken);
- Verwijder vervolgens alle HTML tags;
- Vervang de tags uit de eerste stap terug naar valide HTML tags.

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.

Pagina: 1