2016-12-19 8 views
5

私は相対パスを含む、<img>タグからではなく、どこからだけではなく、HTMLからすべて画像を抽出する必要があります。私はこの正規表現を試しました:画像抽出パス

([a-z\-_0-9\/\:\.]*\.(jpg|jpeg|png|gif)) 

..しかし、それは特別な文字に遭遇して失敗します。例えば、in this caseのようになります。それは、どちらか'(単一引用符)から開始していない"(二重引用符)または/、間にはスペースや画像の拡張子jpg|jpeg|png|gifで終わるように、私はパスをつかむにはどうすればよい

編集:私は可能なDOMパーサを使用しますが、私はちょうど約どこでも、インラインCSSやJSを含むからのパスを抽出するためにここに正規表現を使用する必要があります。

+3

正規表現でHTMLを解析しないでください。代わりに[PHP DOMパーサ](http://simplehtmldom.sourceforge.net/)を使用してください。 –

+0

提案をありがとうが、私はそれを理解し、正規表現を使用する必要があります。私は解析していないデータをマイニングしています。 – 3zzy

+3

lookbehindを悪用して '((?<'' '\ s)* \。(jpg | jpeg | png | gif))'のようなものを試すことができます。シングルまたはダブル)、 - (空白、引用符)を含まず、拡張子の1つで終わります。 – Keelan

答えて

2

あなたはlookbehindを使用することができます。

(?<=['"])[^'"\s]*\.(jpg|jpeg|png|gif) 

これは、引用符や空白が含まれていないと、引用符が先行する任意のURLを解析します。

引用符を照合するよりも見栄えを使う利点は、このように、マッチ全体を直接使用することができ、後処理で引用符を取り除く必要がないことです。 Lookbehindは、複雑な理由のためにすべてのregexライブラリでサポートされていませんが、この場合は代替ではありません。

+0

あなたの説明はちょっと混乱します。キャプチャグループをどのように構成するかによっては、後処理で最初の文字を処理する必要はありません。または、ソリューションでキャプチャグループを使用する必要がないと言っていますか? –

+1

@NathanArthur PHPのライブラリはマッチ全体と一致するグループも返すので、この場合、文字列全体(引用符は含みません)と拡張子の2つの要素の配列が返されます。あなたのソリューションは、引用符で囲まれた文字列全体、引用符のない文字列全体、および拡張子という3つの要素の配列を返します。 – Keelan

1

これは、あなたの試験データに動作します:

['"\/]([^\s'"]+?\.(jpg|jpeg|png|gif)) 

それは、単一引用符、二重引用符やスラッシュを必要とすることによって開始し、その後、ホワイトスペース、単一引用符、二重引用符以外のすべてをキャプチャし、最大最も近い画像拡張。マッチは最初のキャプチャグループに格納されます(多くの場合、$1)。

このソリューションには、ルック・バックを必要としないというメリット(またはおそらくは不利な点)があります。

+0

拡張機能の前にドットを削除して、量指定子を '+?'に変更したのはなぜですか? – Keelan

+0

@CamilStaps私はドットを削除するつもりはなかった。私は最初から模様を作りました。私は私の答えを編集します。遅延マッチングを使用する方が安全だと思っています。OPはおそらく空のURLにマッチしたくありません。 –

+1

サンプルデータでは、文字列も引用符で終わっていることを考慮すると、量指定子は実際には違いはありません。私はちょうど興味があった、あなたが最初からそれを構築するなら、私は理解する。 – Keelan