• ベストアンサー

HTMLタグから<IMG SRC="">のパス取得と書き換え

ローカルにおいてある HTML ファイルを読み込ませて、<IMG SRC="sample.gif"> から sample.gif を取得します。 このsample.gifのMD5を取得し、たとえば MD5 が "abcd...xyz" であれば、 (ローカルの別フォルダ)/a/b/abcd...xyz.gif にコピーし、 元の参照を <IMG SRC="a/b/abcd...xyz.gif"> に変換するというスクリプトを書きたいと考えています。 HTML ファイルから sample.gif を取り出す方法、ファイルからMD5を取得する方法について教えていただけないでしょうか。 HTMLのパースなど調べたのですが、特定の属性を書き換える方法は 分かりませんでした。 よろしくお願いいたします。

  • Perl
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • g_p_
  • ベストアンサー率53% (28/52)
回答No.1

こんにちは、 書いてから気が付きましたが、画像を先にコピーして、 コピーした情報をハッシュとかに持っといて、その後、その情報を元に HTML を書き換えた方がいいかもですね。 以下のスクリプトは複数参照されている画像は何度もコピーされる事になりますし、エラーも完全無視です、ファイルのロックもしてません。 テストもろくにしてませんし、責任持てませんので、ご自分で書かれる際の参考程度にして下さい。 ファイルを読み込んで正規表現で置換してるだけです。 モジュールは perl5.8 なら多分標準だと思います。 md5 は http://search.cpan.org/~gaas/Digest-MD5-2.36/MD5.pm を参考にしてみてください。 #! perl use 5.008; use strict; use warnings; use Digest::MD5; use File::Copy; main(); sub main {   #画像のコピー先ディレクトリ   my $path = './copy/';   local $/ = undef;   #同ディレクトリ内の拡張子が .html のファイル全て   for my $file ( glob('*.html') ) {     open my $fh, '+<', $file or next;     my $source = <$fh>;     $source =~ s{(<img [^>]* src=")([^"]+)}             { $1 . rename_image( $2, $path ) }igesmx;     truncate $fh, 0;     seek $fh, 0, 0;     print {$fh} $source;     close $fh or next;   } } sub rename_image {   my( $img, $path ) = @_;   my( $name, $ext ) = $img =~ /^(.*)(\.\w+)$/;   my $new_name = $path . Digest::MD5::md5_hex($name) . $ext;   File::Copy::copy( $img, $new_name ) or return $img;   return $new_name; }

参考URL:
http://search.cpan.org/~gaas/Digest-MD5-2.36/MD5.pm
yocean1201
質問者

お礼

ありがとうございます。 ソースまで提供していただき、大変助かります。 動作の確認をしましたが、希望している動作とは多少異なるようです。 ・引数で読み込むhtmlファイルを指定したい ・フォルダの掘り方が違う ・フォルダがなければ作るようにしたい ・できれば、修正後のhtmlは別ファイルにしたい いただいたソースで理解できているのはこんな感じです。 ・open でファイルを開いて$sourceに入れ、 ・正規表現で<img~src="..." の ... を取得し、 ・rename_image でそのファイルのMD5を取得し、 ・元のファイルのパスも変更する で、自分で修正しようと思うのですが、やっぱり分かりません。 自分でperlを書いていたときは、open でファイルをオープンして、 while (<FH>) などで行ごとに処理してましたが、 提示していただいたソースではファイルごと$sourceに入れてるんですか?? s{..} の正規表現部分も )( の意味が分かりません。私が書くと <img[^>]* src="([^"]+) ()でくくったら$1に入る?のかと思うのですが、残念ながら何もマッチしない・・・。 この s{...}{...}igesmx; としている s って置換の関数? perl って省略が多いせいか、調べても分からない部分が多くて・・。 いい参考サイトがあったら教えてください。 MD5についてはもう少し理解できてから拝見させていただきます。

その他の回答 (2)

  • TYWalker
  • ベストアンサー率42% (281/661)
回答No.3

>perl って省略が多いせいか、調べても分からない部分が多くて・・。 >いい参考サイトがあったら教えてください。 どの言語でもそうですが、サイトでチョコチョコ調べるというよりは最初はドンと本で勉強した方がいいと思いますよ。 http://www.amazon.co.jp/gp/product/4774108170/ref=cm_cr_pr_product_top http://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEPerl-%E3%83%A9%E3%83%B3%E3%83%80%E3%83%AB%E3%83%BBL-%E3%82%B7%E3%83%A5%E3%83%AF%E3%83%AB%E3%83%84/dp/4873111269

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.2

こんにちは、 > ・引数で読み込むhtmlファイルを指定したい コマンドプロンプトから perl xxxx.pl ファイル名 とかやって、スクリプト内で、$ARGV[0] を参照すれば良いと思います。 > ・フォルダの掘り方が違う これも引数とかで指定してやれば良いと思います。 > ・フォルダがなければ作るようにしたい ファイルテスト演算子を使って判定して、なければ、mkdir すればよいとおもいます。 > ・できれば、修正後のhtmlは別ファイルにしたい ファイルのオープンを読み込みオープンにして、 任意のファイル名で新規書き出ししてください。 > いただいたソースで理解できているのはこんな感じです。 > ・open でファイルを開いて$sourceに入れ、 > ・正規表現で<img~src="..." の ... を取得し、 > ・rename_image でそのファイルのMD5を取得し、 > ・元のファイルのパスも変更する その通りです。 > で、自分で修正しようと思うのですが、やっぱり分かりません。 > 自分でperlを書いていたときは、open でファイルをオープンして、 > while (<FH>) などで行ごとに処理してましたが、 > 提示していただいたソースではファイルごと$sourceに入れてるんですか?? です。 local $/ = undef; で、ファイルを丸呑みするようになります。 > s{..} の正規表現部分も )( の意味が分かりません。私が書くと > <img[^>]* src="([^"]+) > ()でくくったら$1に入る?のかと思うのですが、残念ながら何もマッチしない・・・。 > この s{...}{...}igesmx; > としている s って置換の関数? $str =~ s/hoge/fuga/; で、$str 内の 'hoge' を 'fuga' に置換します。 正規表現はあまり得意じゃないので、アレなんですが… 正規表現内で()で括ると後方参照できるようになります。 最初の括弧でキャプチャした文字列を$1次の括弧が$2…てな感じです。 で、イメージタグの src 属性のファイル名の直前までの文字列を$1にキャプチャして、 $2 にファイル名をキャプチャしているつもりです。 で、それをサブルーチンに渡して、コピーできたら、新しいファイル名を返してくるので、 そのファイル名とさっきキャプチャしたファイル名直前までの文字列を結合して、 マッチした全体と置換しているつもりです。 正規表現に e オプションをつけると、perl スクリプトとして評価されます。 正規表現のオプションに関しては、google 先生に尋ねてください。 勝手な事しまして、かえって混乱させてしまったようですね、すみませんです。 通常、ファイルは1行ずつ処理した方が少ないメモリで処理できて良いのでしょうが、 ローカルで行う処理なら、丸呑みも良いと思います。 その為のモジュールもありますので、時間が合ったら調べてみられたら良いかもです。

yocean1201
質問者

お礼

ありがとうございました! ちょっと分からないところが多かったのですが、 じっくり調べながらソースを読み返してみると、 ほぼ理解でき、目的のものも作ることができました。 > $str =~ s/hoge/fuga/; これは知ってたのですが、 $str =~ s{hoge}{fuga}; と書いてもよいんですね。別の関数かなんかなのかと思ってしまいました。 扱ってるhtml ファイルはサイズも大して大きいものがないので、 ファイルを丸ごと処理できる方法を教えていただき、とても助かりました。 複数行にまたがるタグも多いのですが、その置換もできました。 本当にありがとうございました。

関連するQ&A

  • HTMLのIMGタグについて

    HTMLのimgタグで(1)と(2)のようにした場合、表示が異なります。 (1)のほうが画像間のスペースが広くなります。また(2)の場合でも ほんの少しスペースが開くようです。 (1) <img src="image1"> <img src="image2"> (2) <img src="image1"><img src="image2"> HTMLは文章の構造タグなので(1)でも(2)の場合でも、改行は関係ないので 同じ表示になるべきなのではないでしょうか? なぜ異なった表示になるのでしょうか。 また画像間のスペースを0にしたいのですが、何か方法を教えてください。

    • ベストアンサー
    • HTML
  • srcに「banner.」で始まるファイルを指定しているimgタグが消える

    急に謎の症状が発生して困っています。 何か知っている方がいたらご教示お願いします。 謎の症状が起きるスクリプトの例------------------------ echo '<div>'; echo '<a href="hoge1"><img src="img/banner.jpg"></a>'; echo '<a href="hoge2"><img src="img/banner2.gif"></a>'; echo '<a href="hoge3"><img src="banner.gif"></a>'; echo '<a href="hoge4"><img src="banner.png"></a>'; echo '<a href="hoge5"><img src="hogehoge.gif"></a>'; echo '</div>'; ------------------------------------------------------ 上記のようなスクリプトを実行した場合に、3行目の「img/banner2.gif」と6行目の「hogehoge.gif」を指定しているimgタグしか表示されません。 残りはimgタグの部分だけ綺麗さっぱりに消えてaタグの部分だけ表示されます。実行結果が下記のようになるのです。(実際には改行されませんが、見やすいように改行してます。) 実行結果--------------------------------------- <div> <a href="hoge1"></a> <a href="hoge2"><img src="img/banner2.gif"></a> <a href="hoge3"></a> <a href="hoge4"></a> <a href="hoge5"><img src="hogehoge.gif"></a> </div> ----------------------------------------------- banner.gifやimg/banner.gifは表示されるファイルと同じディレクトリの中に存在しています。 昨日ちゃんと表示されていたのを確認しました。そのときからサーバーの設定は変更していないので、何が原因なのかが分かりません。 過去に同じような症状が起こった方はいないでしょうか? PHPのエラーログを見てもエラーも警告もありませんでした。 【環境】 OS: CentOS/5 HTTPD: Apache/2.2.3 PHP: PHP/5.1.6(eAccelarator、ZendOptimizerが入ってます) ちなみに「banner」だけだとOKでした。「banner.」が付くとダメみたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • <img src=http://にしたい

    PHPでWebページのソースを取得して そのソースの中の<img>タグの src属性がもしhttp://で始まらなかった場合 取得したURLをsrc属性に加える方法はないでしょうか? 例 URL=http://www.○○.com ソース <img src="/image/01.jpg"> ↓ <img src="http://www.○○.com/image/01.jpg"> に変更したいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • HTML の<img> タグについて

    御世話になります。 Windows10でHTMLの<img> タグを使って画像を表示させたいのですが、タグの中の src 属性に、ファイルエ・クスプローラーでShiftキーを押したままマウスの右クリックで得られるファイルのパスを張り付けると、画像が表示されず、小さなサムネイルのようなもの(決して実際の画像のサムネイルではありません)だけになります。 HTML文書と同じレベルにおいてあるフォルダー内の画像はちゃんと表示されるのですが。 これはコンピューターのあちこちにある任意の画像を表示させたければ、HTML文書と同じレベル以下のフォルダーにコピーしておかなければならないという事なのでしょうか?それとも各画像をコピーしてこなくてもそのままの位置に置いたまま表示させる方法があるのでしょうか? どなたか詳しい方がいらっしゃいましたら、詳しく教えて頂きたいと思います。 自分のソースコードを張り付けておきます。 まず表示されるもの。 <!DOCTYPE HTML> <HTML> <head> <title> example02</title> </head> <body> <img src="C:/xampp/htdocs/PHP-OOP/images/EVEdAnT.jpg" width="600" height="400"> </body> </html> 次に、表示されないもの。 <!DOCTYPE HTML> <HTML> <head> <title> example02</title> </head> <body> <img src= "images/EVEdAnT.jpg" width="600" height="400"> </body> </html> 以上、よろしくお願いいたします。

    • ベストアンサー
    • HTML
  • imgタグについて

    imgタグについて http://okwave.jp/qa/q5970749.html この件で質問させていただいてましたが、気になる事がありましたのでアドバイスください。 最初のタグーーーーーーーー img{border: 0; vertical-align:bottom;} ーーーーーーーーーーーーー <img src="/img/space.gif" width="100%" height="10px"/> IE8でimgタグのvertical-align:top;が反応して1px×1pxの透明の画像が縦に10px以上伸びてしまっていました。 ↓そこで、このように分ければいいとアドバイスいただきましたが、 .img1{border: 0;} .img2{border: 0; vertical-align:bottom;} imgタグは他のページでも使用しているため img{border: 0; vertical-align:bottom;}は変更出来ませんでした。 そこで、img2{border : 0;} とcssに書き込み <img2 src="http://www.itumonavi.jp/img/space.gif" width="100%" height="10px" /> にするとバグは解消されました。 ですが、html的に<img2~ というタグは見た事無いのですが、これは使っておいても問題ないのでしょうか? もし他に方法がございましたら教えてください。 【css】-------------------------- img { border: 0; vertical-align:top; } .img1 { border: 0; } 【html】-------------------------- <table width="635" height="31" border="0" cellspacing="0" cellpadding="0" bgcolor="#999999"> <tr> <td width="635">タイトル</td> </tr> </table> <table width="635" border="0" cellspacing="0" cellpadding="0"> <tr> <td colspan="3"><img src="/img/space.gif" width="100%" height="10px" class="img1"/><!-- スペース --></td> </tr> <tr> <td width="170" rowspan="2"><img src="img/sample.gif" width="170" height="170" alt="test" /></td> <td width="20" rowspan="2"><img src="img/space.gif" width="20" height="170" class="img1" /><!-- スペース --></td> <td width="445" style="vertical-align:text-top"><img src="img/space.gif" width="100%" height="5" class="img1" /><!-- スペース -->コピー<div class="guide-line"></div><!-- ライン --> </td> </tr> </table>

    • ベストアンサー
    • HTML
  • imgタグのsrcの指定

    PHPおよびHtmlの構文にて、下記のsrcの指定は正しいのでしょうか? 実はこれ、Freeのスクリプトのコードですが、出力をすると、imgのリンクがhttp://bestpartnerusa.com/images/default_photo.php?profile=4と出力されてしまい、写真の部分が×表示されてしまいます。なにか、お気づきの点がありましたら、ご教示をお願いします。 echo "<a href=\"index.php?page=view_profile&id=".$profile[ id ]."\"><img height=100 border=0 hspace=0 vspace=0 src='images/default_photo.php?profile=".$profile[ id ]."'></a>";

    • ベストアンサー
    • PHP
  • HTMLからimgのsrcのみを正規表現で抽出する

    Webサイトから画像だけをダウンロードするツールをJavaの勉強がてら作成しており、HTML内に含まれた全てのimgタグのsrc部分のみを抽出したいと考えています。 現在、正規表現を使ってHTMLからimgタグのsrcを抽出し、srcの一覧を取得するようなメソッドを作成していますが、私の実力が及ばないばかりに上手く出来ずに困っております。 以下のようなHTMLが有った場合の例を挙げます。 <html> <body> <img src="hoge.jpeg"> <img src="./hoge.jpeg"> <img src="./fuga/hoge.jpeg"> <img src="../fuga/hoge.jpeg"> <img src="http://fuga/hoge.jpeg"> </body> </html> 上記のHTMLがString型に格納されてますので、 作成した抽出用メソッドの引数に渡すと以下のようなString[]型の文字列を返す想定をしています。 [0]=hoge.jpeg [1]=./hoge.jpeg [2]=./fuga/hoge.jpeg [3]=../fuga/hoge.jpeg [4]=http://fuga/hoge.jpeg しかしながら現在、以下のような結果となり、最後の1件しか取得できていない状況です。 [0]=http://fuga/hoge.jpeg 恐らく正規表現が正しくないせいだとは思いますが、どのようにすれば取得できるのか分からず困っています。 もしこの問題についての解決策をご存じの方がおりましたら、ご教示いただけましたら幸いです。 よろしくお願いします 以下、作成中のテストソースです。 //---------------------------------------------------- import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String testHtml = "<html><body><img src=\"hoge.jpeg\"><img src=\"./hoge.jpeg\"><img src=\"./fuga/hoge.jpeg\"><img src=\"../fuga/hoge.jpeg\"><img src=\"http://fuga/hoge.jpeg\"></body></html>"; String[] res = extractImgSrc(testHtml); // 結果表示 for (int i = 0; i < res.length; i++) { System.out.println("res[" + i + "]=" + res[i]); } } // imgタグのsrcからurlを抽出 public static String[] extractImgSrc(String html) { List<String> result = new ArrayList<String>(); Pattern p = Pattern.compile("<\\s*img.*src\\s*=\\s*([\\\"'])?([^ \\\"']*)[^>]*>"); Matcher m = p.matcher(html); while (m.find()) { result.add(m.group(2)); } return result.toArray(new String[result.size()]); } }

    • ベストアンサー
    • Java
  • <A href= と<IMG srcの使い分け

    <A href= と<IMG srcの使い分けについて伺いたいのですが 一応は以下のようになっていると思っておりますが、 基準がどこにあるのでしょうか? <A href=の対象について <A href="mailto:○○○○○○">   アドレス <A href="○○○○○○.html">  URL等 <A href="image.pdf" target="_blank">  PDF等を開かせる <IMG src=の対象について <IMG src="○○○.gif"等の様に、画像の拡張子になっている。

    • ベストアンサー
    • HTML
  • HTMLの記述について

    HTMLの記述について二つ質問です. (1) ,一つ下のディレクトリにある画像などを参照するとき, a) <img src="images/logo.gif"> b) <img src="./images/logo.gif"> と,どちらの記述でも同じ画像を表示できますが,何か違いがあるのでしょうか. (2) たまに,<br> を <br /> などと記述しているHTMLソースをみかけますが,  これらにも何か違いはありますか? よろしくお願い致します。

    • ベストアンサー
    • HTML
  • <img src=~.php>へのデータの受け渡し

    フレームで上がA.php、下がB.htmという構成になっています。 A.phpのほうでデータベースから値を取得しB.htmのほうにPOSTで渡して、 B.htmの中でA.phpで取得した値を使ってC.phpが画像を生成しファイルとしてではなく、 そのまま出力するというものを作っているのですがうまくできません。 タイトルで書いた通り<img src="C.php">という形でB.htmの中で表示させる方法を教えてください。 お願いします。

    • ベストアンサー
    • PHP