- ベストアンサー
正規表現による文字列の抽出
$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";}
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
だいぶ混乱しているみたいですね。 ピリオドが変な具合に入ってます。 マッチングで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オプションをつけて見やすくしてみました #あまりそうでもないかもしれない
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
#1の例は質問者さんのスクリプトを最大限活かそうと思ってのものですので、 #2の方のコメントも踏まえつつお好きに改変してくださいませ >質問者様
お礼
ご親切にどうもありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
//g を配列コンテキストで使うと「キャプチャした部分を全てまとめたリスト」になるはずなので, while のところは実は my @arr = ($data =~ /.../gi); でいいような気がします>#1.
お礼
そういう書き方もできるのですね。 参考になります。 ありがとうございます。
お礼
なるほど!! すばやい回答ありがとうございます。