• ベストアンサー

正規表現(~を含まないものにマッチ)

Perlの正規表現について質問です。 画像<img src="http://hogehoge.com/img/gokuu.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/pikkoro.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/bejiita.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/gohan.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/buruma.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> ↓ 処理後 ↓ 画像<img src="gazo_new1.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new2.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new3.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new4.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new5.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> (変更した画像:gokuu.jpg,pikkoro.jpg,bejiita.jpg,gohan.jpg,buruma.jpg,) 以上のように 画像URL部分のみを gazo_new(連番).jpg に変更させ、 変更前の画像URL一覧を表示させるスクリプトを書いてみました。 $htmldata にHTMLの全データが格納されているとします。 $i=1; while($htmldata=~/(<\s*img.*?src.*?=["\s]*)([.\/]*?\/)?((?:(?!gazo_new)[^"\s>])*)?["\s]?.*?>/i){ $imgurlparts .="$3,"; $htmldata=~ s/(<\s*img.*?src.*?=["\s]*)((?:(?!gazo_new)[^"\s>])*)?(["\s]?.*?>)/$1gazo_new$i.jpg$3/i; $i++; } $htmldata .="(変更した画像:$imgurlparts)"; どうにもうまく動きません。 何卒ご教示をお願い致します。

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

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

処理後のパターンを見るとこんな感じ? #!/usr/bin/perl use strict; use warnings; my $html = do {local $/; <DATA>}; my $index; my @modified; print $html; $html =~ s{<img src="[^"]*/([^/"]+)"}{push @modified, $1 ; '<img src="gazou_new' . ++$index . '.jpg"'}ge; #" print "####\n"; print $html; print "(変更した画像 @modified)\n"; __END__ 画像<img src="http://hogehoge.com/img/gokuu.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/pikkoro.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/bejiita.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/gohan.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/buruma.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 実行結果: 画像<img src="http://hogehoge.com/img/gokuu.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/pikkoro.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/bejiita.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/gohan.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/buruma.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> #### 画像<img src="gazou_new1.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazou_new2.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazou_new3.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazou_new4.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazou_new5.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> (変更した画像 gokuu.jpg pikkoro.jpg bejiita.jpg gohan.jpg buruma.jpg) 細かい違いは適当にいじっていただくということで。

nerumako
質問者

お礼

非常にスマートな式に圧巻です。 まさかwhileループが排除されるとは予想もしてませんでした。 正規表現のs置換の中でループと同じ様な処理が可能なのですね。 (~を含まないものにマッチ)に固着しすぎていたようです。 正規表現の奥深さを感じると同時に自分の勉強不足を恥じるばかりです。 また、do はまったく使った事無かったですが便利ですね。 一歩前進できそうな気がしてきました。 誠にありがとうございました。

その他の回答 (1)

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.1

こんちは $i = 1; while ($htmldata =~ s~(<\s*img.*?src\s*=\s*"?\s*)([^/"\s]*/)*((?!gazo_new)[^">\s]+)~$1gazo_new$i.jpg~i) { $imgurlparts .="$3,"; $i++; } $htmldata .="(変更した画像:$imgurlparts)"; なんとなくうごいてるような..

nerumako
質問者

お礼

バッチリ動いてます。 完全に正規表現の迷子になってました。 ご回答ありがとうございました。

関連するQ&A