ラボ > PHP:通信絡み、PATHやURL関連、ファイル関連

PHP 日本語を含むURLでfile_get_contents()がfalseになる。

日本語ドメインじゃなく、ファイル名等に日本語が使われいるときの問題。

作成日:2018-02-19, 更新日:2018-07-10

基本

URLじゃなくてファイル名に特定の日本語が使われているときの問題。
SJIS絡みの可能性が限りなく高い・・・。

$url = 'http://ドメイン/日本語ファイル名';
var_dump(@file_get_contents($url)); // 「false」になることがある

・ファイル名のトコだけ分割されているなら、ファイル名を「urlencode()」してあげる。
・区切られていない場合は・・・どうにかする。

ファイル名のトコだけ分割されている場合

$domn = 'http://〇〇〇/〇〇〇/';
$path = '日本語のファイル名.html';

var_dump( $domn . urlencode($path) );

ファイル名のトコが分割されていない場合

・日本語ドメインは・・・エラー分岐させない(あらかじめPUNYコードにしておく)
・1バイト文字じゃない文字を「urlencode()」する。

良い方法があるかもしれないけど・・・分からないので「preg_replace_callback()」で対応する

function parseTagsRecursive($input) {
   $regex = '/[^\x01-\x7E]/u';
   
   if (is_array($input)) {
      $input = urlencode($input[0]);
   }
   
   return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}

$url = 'http://ドメイン/日本語ファイル名';
$fixUrl = parseTagsRecursive($url);
var_dump( @file_get_contents($fixUrl) );

※「PHPで特定の範囲内の文字列内で置き換え(preg_replace_callback())」参照