2009-05-18 9 views
1

イメージタグのsrc、width、height属性と一致する正規表現を書こうとしています。幅と高さはオプションです。imgタグのsrc、height、width属性と一致するREGEXを書く

は私が思い付いている以下:

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

エスプレッソは、この一致を示し、次のHTMLは、私は本当に近いと誰かだ願ってい

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

をスニペットのためだけのsrcビットここで私が間違っていることを指摘することができます、私は文字の間に私の任意のビット(?:。*)私はそれを非貪欲に成功しようとしました。だから、どんな指針?

+2

あなたは正規表現を使用する必要があるのはなぜ?代わりにHTML解析ライブラリを使って実行し、代わりにXMLReader関数を使用できますか? – duckyflip

+1

正規表現の構文は言語によって異なります。どの言語を使用していますか? Perl、ルビー、他に何か? さらに重要なことに、正規表現の代わりにhtmlパーサを使用することを検討してください。 srcがwidthとheightよりも後であれば、正規表現が一致すると思いますか? – dave4420

答えて

9

正規表現を使用してHTMLから値を引き出すことは、常に間違いです。 HTML構文ははるかに複雑であり、最初に出現する可能性があり、非常に複雑な正規表現であってもページが非常に簡単に出てくる。

代わりにHTML Parserを使用してください。

This question has been asked beforeとなり、再度尋ねられます。正規表現はこの問題の良い選択のように思えますが、そうではありません。

+0

HTML Parserを使用する方がはるかに簡単でした.HTMLAgilityPackを使用することで、はるかに高速になり、より多くの制御が可能になりました。どうもありがとう – MJJames

1

ほとんどの正規表現の方言では、.*は「貪欲」でオーバーマッチします。代わりに.*?を使用して、「可能な限り小さく」一致させてください。

1

(私は名前の一致を使用していないことに注意してください)私はそれをテストする機会を持っていませんでしたが、多分これはあなたのために動作します:

<img(?:(\s*(src|height|width)\s*=\s*"([^"]+)"\s*)+|[^>]+?)*> 
関連する問題