• ベストアンサー

正規表現による文字列の抽出

$data = 'a b c<a href="x/y/z/hoge.jpg">hoge.jpg </a> …<A HREF = "aa/b/c/hoga.jpg">hoga.jpg</A>…'; 上記の文字列から正規表現で 『x/y/z/hoge.jpg』と『aa/b/c/hoga.jpg』を取り出して配列に格納しようと思っているのですがうまくいきません。 条件は 1.『<a href="』(大文字の場合、またはイコールの前後に半角スペースが含まれる場合もあります。)と『">』に囲まれています。 2.文字列中に何回登場するかは決まっておりません。 3.取り出す文字列の長さはきまっておりません。 以下のように書いてみたのですが…。書き方がわかりません。 どなたかご教授いただけないでしょうか。 よろしくお願いいたします。 while ($data =~ /<a\s[hH][rR][eE][fF].=.\".*?">/g){ push(@arr, $&); } foreach(@arr){print $_,"\n";}

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

だいぶ混乱しているみたいですね。 ピリオドが変な具合に入ってます。 マッチングでiオプションをつければ大小文字の違いは無視してくれます。 てなところでこんなのとか my $data = 'a b c<a href="x/y/z/hoge.jpg">hoge.jpg </a> …<A HREF = "aa/b/c/hoga.jpg">hoga.jpg</A>…'; my @arr; while ($data =~ /<a \s* href \s* = \s* "([^"]+)" >/gix){ push(@arr, $1); } print join("\n", @arr), "\n"; xオプションをつけて見やすくしてみました #あまりそうでもないかもしれない

hulihalj
質問者

お礼

なるほど!! すばやい回答ありがとうございます。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

#1の例は質問者さんのスクリプトを最大限活かそうと思ってのものですので、 #2の方のコメントも踏まえつつお好きに改変してくださいませ >質問者様

hulihalj
質問者

お礼

ご親切にどうもありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

//g を配列コンテキストで使うと「キャプチャした部分を全てまとめたリスト」になるはずなので, while のところは実は my @arr = ($data =~ /.../gi); でいいような気がします>#1.

hulihalj
質問者

お礼

そういう書き方もできるのですね。 参考になります。 ありがとうございます。

関連するQ&A

専門家に質問してみよう