LoginSignup
1
1

More than 1 year has passed since last update.

PHPで日本語を含んだURLから画像ファイルを取得した方法

Posted at

はじめに

PHPで日本語を含んだURLリンクから画像ファイルを取得しようとした時に、何箇所かつまったので記事として残します。

対象者

この記事は下記のような人を対象にしています。

  • PHPでの日本語を含んだURLの使用に慣れていない人
  • プログラミング初学者

目次

日本語を含むURLリンクを作成

http://127.0.0.1 といったリンクにファイルが置いてあるディレクトリまでのパスの文字列を結合して、URLエンコード(URLとして使用できない文字を、URLで使用できる文字の特殊な組み合わせに変換)します。

directory_link.php
$directory_link = "http://127.0.0.1"."/pdf保存場所";
$encoded_directory_link = urlencod($directory_link);

日本語リンクを扱う上で便利だったのは以下の関数です。

useful_command_for_directory_link.php
// urlエンコード: スペースを "+" に変換
urlencode($link);
// urlエンコード: スペースを "%20" に変換
rawurlencode($link);

// 日本語の字数数える
mb_strlen($zuban);

// 日本語の文字切出し
mb_substr($zuban,0,4);

URLリンク先のページが表示されるか確認

URLリンク先がちゃんと生きていてページが表示されるか、ステータスを確認します。

function_is_alive.php
// リンク先が生きているか死んでいるかをたしかめるためにリクエストを送る
function isAliveLink(string $link){
    try{
        //コンテキストを作成
        $context = stream_context_create(
            [
                "http"=>
                [
                    "ignore_errors"=>true
                ]
            ]
        );
        //リクエストを送る
        $html = file_get_contents($link, false, $context);
        //ステータスコードを正規表現で得る
        preg_match("/[0-9]{3}/", $http_response_header[0], $stcode);
        if((int)$stcode[0] < 200 || (int)$stcode[0] > 299){
            return false;
        }
    }catch(Exception $e){
        echo "catch Exception.<br>";
        exit;
    }
    return true;
}

URLリンク先からファイル取得

私の場合はディレクトリのURLリンクから、「写真」または「元ネタ」がついたファイルを取得したかったので、URLリンクページのaタグからリンクを取得後、正規表現を使用して最初にヒットしたファイルを取得しました。

function_fetch_file.php
// リンク先のファイルを取得
function fetchFile(string $link){
    // コンテキストを作成
    $context = stream_context_create(
        [
            "http"=>
            [
                "ignore_errors"=>true
            ]
        ]
    );
    // リクエストを送信
    $html = file_get_contents($link, false, $context);

    // 読み込んだHTMLの文字化け対策
    $html = mb_convert_encoding($html, 'HTML-ENTITIES','UTF-8');
    $domDocument = new \DOMDocument();
    // HTMLをパース
    $domDocument->loadHTML($html);

    // <a>~</a>内を取得
    $domElements = $domDocument->getElementsByTagName('a');
    // 最初のノードを取得し、ノード内の子ノードを取得
    $nodes = $domElements;
    for($i = 0; $i < $nodes->length; $i++) {
        $src[] = $nodes->item($i)->nodeValue;
    }

    // ファイル名を降順に並び替え、正規表現で一番はじめにヒットしたファイルを取得
    $file_list = $src;
    rsort($file_list);
    $file = null;
    foreach ($file_list as $value) {
        if(preg_match('/写真|元ネタ/u', $value)){
            $file = $value;
            break;
        }
    }
    return $file;
}


おわりに

PHPで日本語URLリンクを変換して、ファイルを取得するまでについてまとめました。
少しでも役に立つよう、ご意見やご指摘など気軽にコメントしていただけると助かります。

参考記事

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1