2009-05-18 10 views
1

Ich versuche einen Regex-Ausdruck zu schreiben, der den src-, width- und height-Attributen eines Image-Tags entspricht. Die Breite und Höhe sind optional.Einen REGEX schreiben, um die src-, height- und width-Attribute eines img-Tags zu entsprechen

kam ich habe oben mit den folgenden:

(?:<img.*)(?<=src=")(?<src>([\w\s://?=&.]*)?)?(?:.*)(?<height>(?<=height=")\d*)?(?:.*)(?<width>(?<=width=")(\d*)?)? 

Expresso zeigt diese Anpassung nur die src-Bit für die folgenden HTML-Schnipsel

<img src="myimage.jpg" height="20" /> 
<img src="anotherImage.gif" width="30"/> 

Ich hoffe, ich bin wirklich in der Nähe und jemand Hier kann man darauf hinweisen, was ich falsch mache, ich habe das Gefühl, es ist mein fakultatives Zwischenzeichen (;:. *) Ich habe versucht es nicht gierig zu machen um keinen Erfolg zu haben. Also irgendwelche Hinweise?

+2

Warum Sie Regex verwenden, brauchen? Können Sie es nicht durch eine HTML-Parsing-Bibliothek ausführen und stattdessen XMLReader-Funktionen verwenden? – duckyflip

+1

Regex-Syntax ist in verschiedenen Sprachen unterschiedlich. Welche Sprache verwendest du? Perl, Rubin, noch etwas? Noch wichtiger ist, verwenden Sie einen HTML-Parser anstelle einer Regex. Denkst du, dass eine Regex übereinstimmen wird, wenn die src nach der Breite und Höhe ist, anstatt vorher? – dave4420

Antwort

9

Die Verwendung regulärer Ausdrücke zum Abrufen von Werten aus HTML ist immer ein Fehler. Die HTML-Syntax ist sehr viel komplexer, als dass sie zuerst auftaucht und es ist sehr einfach für eine Seite, selbst einen sehr komplexen regulären Ausdruck zu erkennen.

Verwenden Sie stattdessen eine HTML Parser.

This question has been asked before und wird erneut gefragt werden. Reguläre Ausdrücke scheinen eine gute Wahl für dieses Problem zu sein, aber sie sind es nicht.

+0

Es war viel einfacher, einen HTML-Parser zu verwenden, ich benutzte HTMLAgilityPack, so viel schneller und gibt Ihnen mehr Kontrolle. Danke vielmals – MJJames

1

In den meisten Regex-Dialekten ist .* "gierig" und wird übermatch; Verwenden Sie .*?, um "so wenig wie möglich" zu finden.

1

ich hatte keine Chance, es zu testen, aber vielleicht wird dies für Sie arbeiten (beachten Sie, dass ich nicht genannt Matches verwendet haben):

<img(?:(\s*(src|height|width)\s*=\s*"([^"]+)"\s*)+|[^>]+?)*> 
Verwandte Themen