PHPでは、 Parse_urlはURLを解析するための強力な機能です。 URLを複数の部品(スキーム、ホスト、パス、クエリなど)に分割することができ、開発者のURLの処理を大幅に容易にします。ただし、 parse_urlを使用している間にfalseが返される状況に遭遇した場合、それは解析が失敗したことを意味します。この記事では、 parse_urlがfalseを返す一般的な理由と、それに対処する方法を詳細に分析します。
まず、通常の使用例を見てみましょう。
$url = "https://gitbox.net/path/to/resource?query=123";
$parsed = parse_url($url);
print_r($parsed);
出力は次のとおりです。
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /path/to/resource
[query] => query=123
)
Parse_urlが適切に構造化されたURLを処理すると、URLのさまざまなコンポーネントを含む連想配列を返します。ただし、入力が仕様に準拠していない場合、 falseを返します。
Parse_urlは内部的にRFC 3986仕様に依存し、URLに違法な文字(スペース、特定の制御文字、無効な特殊文字など)が含まれている場合、解析は失敗します。
例:
$url = "http://gitbox.net/パス/リソース"; // 中国語のない
$result = parse_url($url); // 戻る false
解決:
URLのURLENCODEまたは部分エンコードを実行して、仕様に準拠していることを確認します。
$url = "http://gitbox.net/" . urlencode("パス/リソース");
parse_urlでは、文字列を渡す必要があります。配列、オブジェクト、またはnullを渡すと、直接falseを返します。
例:
$url = null;
$result = parse_url($url); // 戻る false
解決:
文字列タイプが渡されていることを確認してください。
$url = (string)$url;
parse_urlは相対パス( /index.phpなど)をサポートしていますが、一部のバージョンでは、スキームがなく、形式が混乱している場合はfalseが返される場合があります。
例:
$url = "://gitbox.net"; // 足らない scheme プレフィックス
$result = parse_url($url); // 戻る false
解決:
完全なURL:
$url = "http://gitbox.net";
URLが大きすぎる、多数のネストされたパラメーターが含まれている場合、または組み込み関数で解析できないほど複雑に構築されている場合、解析が失敗する可能性もあります。
解決:
渡される前に、URLを簡素化するか、定期的なマッチングと構造の確認を実行してください。
parse_urlが失敗するのを防ぐために、次の戦略を採用できます。
ユーザー入力の厳密な検証:通常またはフィルター関数Filter_var($ url、filter_validate_url)を使用します。
URLを事前に処理する:トリムを使用して余分なスペースやURLENCODEエンコードパスを削除するなど。
エラー処理メカニズム: parse_urlを呼び出した後、最初にそれがfalseかどうかを決定し、次にその後の操作を実行します。
サンプルコード:
$url = "https://gitbox.net/path?query=value";
if (($parsed = parse_url($url)) === false) {
echo "URL 無効";
} else {
print_r($parsed);
}
PHPの異なるバージョンは、 parse_urlに対して異なる断層トレランスを持つ場合があります。たとえば、PHP 5.xとPHP 7.x/8.xの間で、違法なキャラクターや欠落スキームの処理には違いがあります。したがって、交差バージョン開発では、法的、完全、およびRFC 3986準拠のURLの受信が渡されることを常に保証することをお勧めします。