質問 |
||
| 質問者:hulihalj | 正規表現による文字列の抽出 | |
|---|---|---|
困り度:
|
$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";} |
|
質問投稿日時:08/03/17 22:57 質問番号:3872069 |
||
回答 |
|
| 回答者:sakusaker7 | #1の例は質問者さんのスクリプトを最大限活かそうと思ってのものですので、 #2の方のコメントも踏まえつつお好きに改変してくださいませ >質問者様 |
|---|---|
| 種類:アドバイス どんな人:経験者 自信:参考意見 |
|
| |
回答日時:08/03/18 01:40 回答番号:No.3 |
|
| この回答へのお礼 | ご親切にどうもありがとうございます。 |
回答良回答10pt |
|
| 回答者:Tacosan | //g を配列コンテキストで使うと「キャプチャした部分を全てまとめたリスト」になるはずなので, while のところは実は my @arr = ($data =~ /.../gi); でいいような気がします>#1. |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/18 00:14 回答番号:No.2 |
|
| この回答へのお礼 | そういう書き方もできるのですね。 参考になります。 ありがとうございます。 |
回答良回答20pt |
|
| 回答者:sakusaker7 | だいぶ混乱しているみたいですね。 ピリオドが変な具合に入ってます。 マッチングで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オプションをつけて見やすくしてみました #あまりそうでもないかもしれない |
|---|---|
| 種類:回答 どんな人:経験者 自信:参考意見 |
|
| |
回答日時:08/03/18 00:06 回答番号:No.1 |
|
| この回答へのお礼 | なるほど!! すばやい回答ありがとうございます。 |