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

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

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

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


# 目次
<!-- タイトルとアンカー名を編集 -->
- [日本語を含むURLリンクを作成](#Chapter1)
- [URLリンク先のページが表示されるか確認](#Chapter2)
- [URLリンク先からファイル取得](#Chapter3)
- [参考記事](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 日本語を含むURLリンクを作成

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

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

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

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

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

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

```



<a id="#Chapter2"></a>
# URLリンク先のページが表示されるか確認
URLリンク先がちゃんと生きていてページが表示されるか、ステータスを確認します。


```php: 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;
}

```

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


```php: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リンクを変換して、ファイルを取得するまでについてまとめました。
少しでも役に立つよう、ご意見やご指摘など気軽にコメントしていただけると助かります。


<a id="#reference"></a>
# 参考記事
- [PHPで半角スペースをURLエンコードしたい。](https://replication.hatenablog.com/entry/20140518/1400424470)
- [Document: urlencode ](https://www.php.net/manual/ja/function.urlencode.php)
- [Document: rawurlencode ](https://www.php.net/manual/ja/function.rawurlencode.php)
- [PHPのfile_get_contentでエラー回避してステータスコードを取得してみる](https://unskilled.site/phpのfile_get_contentでエラー回避してステータスコードを取得/)
- [サイトから一部のHTMLを抽出](http://php.o0o0.jp/article/php-scraping)