[c#] regex om img tags te parsen

Pagina: 1
Acties:
  • 769 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • MrHighStone
  • Registratie: November 2001
  • Laatst online: 03-02-2023
Jongens, ik zit hier intussen een middag op te studeren, maar ik kom er niet uit.
Het probleem is het volgende, uit een html fragment wil ik met behulp van een regex de img tags halen, waarvan de attributen src, alt en id me interesseren.
Nu had ik een aantal opzetjes, maar elke keer loop ik er tegenaan dat of niet alle tags eruit gematcht worden, of dat ik alle tags er netjes uit krijg, maar dan de attributen er niet meer uitgevist krijg.

Aanvankelijk was ik begonnen met deze regex <img([^>]+)/>
Deze haalt keurig alle img tags eruit, maar nu wil ik in een en dezelfde regex de attributen als group selecteren.

Dus kwam ik op deze regex <img.+id="(.+?)".+src="(.+?)".+alt="(.*?)".*/>
Deze haalt keurig alle id, src en alt attributen eruit, maar zodra de img tags achter elkaar staan, ziet ie deze als een lange tag. Hij eet dus als het ware de volgende tags ook op. Nu weet ik dat ik dit met lookahead kan oplossen, maar ik kom er niet uit hoe.
Bovendien, is deze regex afhankelijk van de volgorde van de attributen, en die volgorde is natuurlijk onbepaald.

Als ik zo zoek schijnt dit in PHP al een aantal keer gedaan te zijn, maar die regexen zitten anders in elkaar dan in .NET.


Wie heeft een ingeving of herkent dit probleem?

Een file op de A12 is nooit grappig...


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dit is vast niet wat je wilt horen, maar here goes:
For the 2,295,485th time: DO NOT PARSE HTML WITH REGULAR EXPRESSIONS :P

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


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Parse html met regular expressions ;)

http://oubliette.alpha-ge...ot_parse_html_with_regexs

Bouw een stack-based parser. Dan kan je veel netter de html-tree afgaan :)

[ Voor 0% gewijzigd door mithras op 14-01-2008 18:07 . Reden: Why, RobIII ;( ]


Acties:
  • 0 Henk 'm!

  • MrHighStone
  • Registratie: November 2001
  • Laatst online: 03-02-2023
Tja, dus nu op zoek naar een goeie html parser voor .NET?

Helaas wordt deze truuk op verschillende plaatsen in de code gebruikt voor andere zaken, en om nu het geheel te gaan herschrijven, alleen omdat regexen niet de allerbeste oplossing is, voel ik weinig voor...

Een file op de A12 is nooit grappig...


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

*als* je al een reguliere expressie gebruikt probeer dan niet alles in 1 expressie te vatten. Match gewoon eerst alle volledige imagetags, en ga dan vanuit die matches de attributen parsen.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Maak er dit van en het werkt voor dit geval: <img.+?id="(.+?)".+?src="(.+?)".+?alt="(.*?)".*?/>

Al zou een betere methode een goede parser zijn zoals RobIII en mithras al zeggen, of meerdere regexen zoals crisp zegt.

Maar... als het niet veel complexer gaat worden dan dit zou zoiets wel kunnen werken:
De regex om de image tags te matchen: <img\s*([^>]+)\s*/?>
De regex om de attributen te matchen: (id|alt|src)="([^"]+)"

Al blijft een goede parser uiteraard beter, dus dat is wel aan te raden ;)

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • pkuppens
  • Registratie: Juni 2007
  • Laatst online: 18-09 07:32
MrHighStone schreef op maandag 14 januari 2008 @ 17:49:
Jongens, ik zit hier intussen een middag op te studeren, maar ik kom er niet uit.
Het probleem is het volgende, uit een html fragment wil ik met behulp van een regex de img tags halen, waarvan de attributen src, alt en id me interesseren.
Nu had ik een aantal opzetjes, maar elke keer loop ik er tegenaan dat of niet alle tags eruit gematcht worden, of dat ik alle tags er netjes uit krijg, maar dan de attributen er niet meer uitgevist krijg.

Aanvankelijk was ik begonnen met deze regex <img([^>]+)/>
Deze haalt keurig alle img tags eruit, maar nu wil ik in een en dezelfde regex de attributen als group selecteren.

Dus kwam ik op deze regex <img.+id="(.+?)".+src="(.+?)".+alt="(.*?)".*/>
Deze haalt keurig alle id, src en alt attributen eruit, maar zodra de img tags achter elkaar staan, ziet ie deze als een lange tag. Hij eet dus als het ware de volgende tags ook op. Nu weet ik dat ik dit met lookahead kan oplossen, maar ik kom er niet uit hoe.
Bovendien, is deze regex afhankelijk van de volgorde van de attributen, en die volgorde is natuurlijk onbepaald.

Als ik zo zoek schijnt dit in PHP al een aantal keer gedaan te zijn, maar die regexen zitten anders in elkaar dan in .NET.


Wie heeft een ingeving of herkent dit probleem?
En als je nog een ? invoegt in .*/> zodat deze .*?/> wordt?
Die laatste .* is nog greedy, zodat string /> blah <img .../> in z'n geheel wordt gematcht.

Gr/P
[Maar ik ben alweer te laat zo te zien]

[ Voor 1% gewijzigd door pkuppens op 15-01-2008 13:41 . Reden: Te laat?! ]


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

De link van RoBIII (zijne was fout)

http://blog.mikeseth.com/...EXPRESSIONS.html#extended
Zorg voor welformed XHTML, en dan kunt ge het parsent met XPath oid:

Going for adventure, lots of sun and a convertible! | GMT-8

Pagina: 1