PHP
Webサイトの内容をコピーして画像のリンクを絶対リンクに修正する
Webサイト作成の現場では、よく既存のWebサイトから、CMSにコピーして移行したり、違うデザインに移行したり、違う構造に移行したいということがあると思います。
大量のコンテンツがある場合、手でコピーして移行するのはなかなか難しいですよね。
しかも、画像ファイルが相対リンクだったりすると、手作業でやるのは泣きそうになります。
というわけで、今回PHPを利用した、移行用のスクリプトを作ってみました。
あまりうまく書けているわけではありませんが、また利用するときのために、書いておきます。適当に自分の環境に合う形に変えてください。
- 移行するサイトのページURLを、あらかじめテキストファイルに一行ずつ書きだしておき、url.txtとして保存します。
- 今回は、データベースへインポートする目的があって、一サイトずつCSVファイルに一行ずつ書き込みます。output.csvというファイルに書き出します。(書き込み権限があれば作っておかなくてもOKです。)
- 相対リンクで記載している画像を絶対リンクに書き換えます。今回のサイトは、3階層以上ないという前提です。(この辺りは環境に合わせて、適当に書き換えてください。)
- ちなみにWebサイトのコンテンツをコピーすることをスクレイピングと言います。人さまが作った大量のサイトも一瞬でコピーできますが、悪い目的で使うのは絶対にやめましょう!
- ~の間を抜きます。
<?php
$fh=fopen('url.txt','r');
$fi=fopen('output.csv','w');
for($line=fgets($fh); ! feof($fh); $line=fgets($fh)){
$line=trim($line);
//URLの内容をスクレイピング
$contents= file_get_contents($line);
//3階層上までのURLを整形しておきます 画像のパスを絶対リンクに変更するために利用します
$current_dir=strripos($line, '/');
$url_current_dir=substr($line, 0, $current_dir);
$one_above=strripos($url_current_dir, '/');
$url_one_above_dir=substr($url_current_dir, 0, $one_above);
$two_above=strripos($url_one_above_dir, '/');
$url_two_above_dir=substr($url_one_above_dir, 0, $two_above);
//画像のパスだけ抜き取る
$pattern = "/src=[\"']?([^\"']?.*(png|jpg|gif))[\"']?/i";
//画像のパスを相対URLを絶対URLに書き換えます。
if(preg_match_all($pattern, $contents, $matches)){
foreach($matches[1] as $match){
if(preg_match('/\.\.\/\.\.\//',$match)){
$replaced_src=preg_replace('/\.\.\//',$url_two_above_dir.'/',$match);
$contents = str_replace($match,$replaced_src,$contents);
}elseif(preg_match('/\.\.\//',$match)){
$replaced_src=preg_replace('/\.\.\//',$url_one_above_dir.'/',$match);
$contents = str_replace($match,$replaced_src,$contents);
}elseif($match){
$replaced_src = $url_current_dir.'/'.$match;
$contents = str_replace($match,$replaced_src,$contents);
}
}
}
$start=strpos($contents, '<BODY>');
$end=strpos($contents, '</BODY>');
//ブラウザで確認できます。
print $output = substr($contents, $start+6, $end-$start);
$output = str_replace("\n","",$output);
fwrite($fi, "$output\n");
}
fclose($fh);
?>
CMS移行時に大量コンテンツのコピーでお悩みですか?ご相談ください。