michimani.net

続・PHPでWebページ上の画像ファイルをすべて保存する

2017-12-28

一年以上前に同じようなことを書いてますが、その続編です。

今みると、このままでは動かないようなソースで残念です。

やることは変わってなくて、諸々考慮したバージョンです。 ソースは GitHub に置いています。 michimani/get-all-image

直したところ

コマンドラインで使えるようにした

前回は関数として作っていたので、その関数を呼ぶスクリプト書かないと使えませんでした。 今回はコマンドラインで使えるようにしたので ターミナルで

$ php get_all_image.php http://example.com

を叩くだけです。
Macなら買ってきた状態でphpコマンドが叩けるので、上のリンクからダウンロードしてすぐ使えます。Windowsのことはちょっとわかりません。

引数のチェックを入れた

前回は引数として受け取るURLのチェックとかは一切していませんでした。

今回はコマンドライン引数としてURLを受け取る様になっているので、そのチェックをしています。

<?php
if (!isset($argv[1]))
{
    throw new Exception('The first argument is required for url.');
}

$url = $argv[1];
if (!preg_match('/^(http|https):\/\//', $url))
{
    throw new Exception('Invalid url.');
}

$header = @get_headers($url);
if (!preg_match('/^HTTP\/.*\s+200\s/i', $header[0]))
{
    throw new Exception('Target page does not found.');
}

画像リンクが http(s) から始まっていないパターンの対応

画像リンクには src="http://~" のパターンと src="/img/~" みたいにドメイン以下のパスが書いてあるパターンがあるので、その対応です。

<?php
$base_tmp = explode('/', $url);
$base = sprintf('%s/%s/%s', $base_tmp[0], $base_tmp[1], $base_tmp[2]);

//...

if (!preg_match('/^https?:\/\//', $img_url))
{
    $img_url = sprintf('%s/%s', $base, $img_url);
}

comments powered by Disqus