PHPでは、 PARSE_URL関数を使用してURL文字列を解析し、プロトコル、ホスト、ポート、パス、クエリパラメーターなどのコンポーネントを返します。この関数は、PHP 5とPHP 8の間に微妙で重要な変更を受け、これらの違いを理解することは、適切なコードを書くために不可欠です。
parse_urlの基本的な使用法は次のとおりです。
<?php
$url = "https://gitbox.net/path/to/page?query=123#fragment";
$parts = parse_url($url);
print_r($parts);
?>
実行後、出力します。
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /path/to/page
[query] => query=123
[fragment] => fragment
)
各部分の個々の操作を容易にするために、URLを連想配列に分割します。
PHP 5では、 Parse_urlには次の主な機能があります。
不規則なフォーマットのURLの場合、解析の結果が不正確またはエラーさえある場合があります。
着信URLが/パス /ファイルなどの相対パスである場合、特定のバージョンに応じて、関数はパスまたはfalseを返す場合があります。
URLに珍しい文字またはエンコーディングが含まれている場合、解析結果は正確には予想通りではない場合があります。
例:
<?php
$url = "http://gitbox.net:8080/path?arg=value#anchor";
print_r(parse_url($url));
?>
出力:
Array
(
[scheme] => http
[host] => gitbox.net
[port] => 8080
[path] => /path
[query] => arg=value
[fragment] => anchor
)
これはPHP 5で正常に機能しますが、不規則なURLに遭遇したときに解析する傾向があります。
PHP 8は、主に以下を含むParse_urlに多くの改善を行っています。
PHP 8は、URL構文の検証により厳しいものであり、PHP 5で無視されるエラーを回避します。たとえば、URLが誤ってフォーマットされている場合、 Parse_URLは誤って戻るか、解析結果の一部を失う可能性が高くなります。
PHP 8は、相対パスと不完全なURLに対してより安定した解析挙動を持ち、一貫性のない結果を返すことを避けます。
PHP 8は、IPv6アドレスを含むURLを解析する場合、以前のバージョンの括弧内のエラーを回避する場合より正確です。
例:
<?php
$url = "http://[::1]:8080/path?arg=value#anchor";
print_r(parse_url($url));
?>
出力:
Array
(
[scheme] => http
[host] => [::1]
[port] => 8080
[path] => /path
[query] => arg=value
[fragment] => anchor
)
コードがPHP 5とPHP 8と互換性がある必要がある場合は、 PARSE_URL解析を使用する前に、通常または他の方法でURL形式を確認することをお勧めします。
機能が誤って戻ったり、特定のキーを失ったりするため、コードクラッシュを避けるために、解析結果について厳密な判断を下します。
IPv6アドレスまたは非標準のURLに遭遇する場合、バージョンの違いによる問題を回避するために、特別な処理ロジックを記述することが最善です。
側面 | PHP 5 | PHP 8 |
---|---|---|
構文検証 | ゆるく、簡単にフォーマットエラーを無視できます | 厳密には、間違った形式が以前に公開されます |
相対URL処理 | おそらく一貫性のない結果を返してください | より合理的な治療、より安定した結果 |
IPv6サポート | 限られたサポート、ブラケット処理のエラー | IPv6アドレスをブラケットで完全にサポートし、正確に解析します |
エラー戻り | エラーまたは不完全な配列を返すことがあります | より明示的に虚偽またはエラーメッセージを返します |
一般に、PHP 8のParse_URLはより堅牢で厳格であり、PHP 8を使用する動作は、高い信頼性とセキュリティを必要とするプロジェクトに推奨されます。
実際の開発でURLの解析の問題が発生した場合は、現在実行中のPHPバージョンを最初に確認し、バージョンの違いについて互換性のあるコードを書き、安定した機能を確保することをお勧めします。