2011/07/10

JavaでHTMLファイル内の画像パス(URL)部分を引っこ抜く


ひょんなことからこの間必要になったのだが、
実装までに予想以上に時間がかかってしまったのでメモしておく。
Javaというよりは正規表現のおはなし。



HTMLのソースを引っ張ってくるのとかは省略。
基本的にはHTMLのソース内のimgタグの該当箇所を正規表現を使ってMatcherで引っ掛けてやればよかった。

という訳で最初に書いたのはこれ。
// 色々中略

Pattern p = Pattern.compile("<img .* src=('|\")(.+?)('|\") .* />", Pattern.MULTILINE);
Matcher m = p.matcher(src);
 // src は HTMLのソースが入っている文字列

while(m.find()){
  srcList.add(m.group(2));
}

石上センパイ(@susumuis) に聞くまで正規表現のグループの事を全く知らなかったのはないしょ。
こんな感じで動かしてみる。
「おお!imgタグからsrcのパスがとれたぞー!」
と喜んでいたのもつかの間、
取得したパスを全部表示させていたので気づいたが
「あれ?なんかパスが少ない...」
ということで、何故か一部のimgタグのsrcのパスしか取れていなかった模様。

試しに m.group() の値を確認してみると
<img src="/hoge/huga1.png" /> ・・・・・・ <div>・・・・・・・ </div>・・・・・<img src="/hoge/huga2.png" />
という感じの「なんじゃこりゃー!」状態。
なんか色々余計なものまでマッチしちゃっている...
ということで色々試行錯誤して以下のように修正してみるとうまくいった。
// 色々中略

Pattern p = Pattern.compile("<img.+?src=\\s*(?:[\\\"'])?([^ \\\"']*)[^>]*>", Pattern.MULTILINE);
Matcher m = p.matcher(src);
 // src は HTMLのソースが入っている文字列

while(m.find()){
  srcList.add(m.group(2));
}


■ 参考にしたページ
しのぶ日記|Javaで正規表現でimgタグから画像のURLを取り出す
Java正規表現の使い方