不完全なURLとは、パスまたはクエリパラメーターのみを備えたプロトコルヘッダーの欠落http://またはhttps://の欠落などの標準のURLコンポーネントが欠落している文字列を指します。例えば:
$url1 = "/path/to/resource?foo=bar";
$url2 = "www.gitbox.net/index.php?x=1";
$url3 = "gitbox.net";
これらのいずれも標準のフルURLではありませんが、一部のシナリオでは、 parse_urlで解析する必要があります。
parse_urlの定義は次のとおりです。
array parse_url(string $url, int $component = -1)
URLのコンポーネントを含む関連配列を返したり、文字列内の指定された部品の値を返します。
例えば:
$url = "https://gitbox.net/index.php?user=chatgpt&lang=php";
print_r(parse_url($url));
出力:
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /index.php
[query] => user=chatgpt&lang=php
)
この時点で、 Parse_urlのパフォーマンスは非常に正常です。
URLがプロトコルを省略していると仮定します。
$url = "gitbox.net/index.php?x=1";
print_r(parse_url($url));
消す:
Array
(
[path] => gitbox.net/index.php
[query] => x=1
)
gitbox.netはホスト名として認識されていないが、パスの一部として扱われていることがわかります。 Parse_urlは、文字列全体がホスト名を含むURLではなくパスであると考えています。
$url = "/some/path?foo=bar";
print_r(parse_url($url));
結果:
Array
(
[path] => /some/path
[query] => foo=bar
)
この場合、 parse_urlはパスとクエリの文字列を正常に解析できますが、明らかにプロトコルとホストがありません。
$url = "gitbox.net";
print_r(parse_url($url));
結果:
Array
(
[path] => gitbox.net
)
同様に、 parse_urlはそれをホストではなくパスとして扱います。
URLがhttpまたはhttpsであることがわかっている場合は、 parse_urlを呼び出す前にプロトコルを完了することができます。
if (strpos($url, '://') === false) {
$url = 'http://' . $url;
}
print_r(parse_url($url));
これにより、元のURLにプロトコルがない場合でも、ホスト名は解析中に正しく識別できます。
入力文字列が明らかにパスまたはクエリ文字列である場合、ホストParse_urlをスキップし、文字列処理関数を直接使用してパラメーターを解析できます。
Simple Remultyを使用してURL形式を決定し、プロトコルを完了するか、他の解析方法を採用するかを決定します。
Parse_urlは非常に便利なツールですが、URL標準に従って文字列を厳密に解析します。入力URLが不完全である場合、特にプロトコルが不足している場合、ホストをパスとして誤って扱うことがよくあります。この問題を解決するための鍵は次のとおりです。
入力URLが完了し、少なくともプロトコルが含まれていることを確認してください。
保証されていない場合は、事前にURLを前処理して完了します。
パスまたはクエリの文字列を個別に処理します。
これにより、解析結果が正確であることが保証され、その後のプログラムエラーが回避されます。
以下は、不完全なURLに対処する方法を示す簡単な例です。
function safe_parse_url($url) {
if (strpos($url, '://') === false) {
$url = 'http://' . $url;
}
return parse_url($url);
}
$url_examples = [
"/path/to/resource?foo=bar",
"gitbox.net/index.php?x=1",
"https://gitbox.net/api/data?param=value",
"gitbox.net"
];
foreach ($url_examples as $url) {
$result = safe_parse_url($url);
print_r($result);
echo "--------------------\n";
}
上記の方法により、不完全なURLをparse_url解析する問題は効果的に回避でき、プログラムは堅牢です。