parse_url関数の構文は非常に単純です:
$url = "https://gitbox.net/path/to/page?name=チャン・サン&age=25";
$parts = parse_url($url);
print_r($parts);
出力結果:
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /path/to/page
[query] => name=チャン・サン&age=25
)
上記の例からわかるように、 parse_urlはプロトコル、ホスト、パス、クエリの文字列をうまく解析できます。
特殊文字には、中国語、スペース、#サイン、パーセントサイン(%)などが含まれます。これらの文字は、URLに異なる意味を持っています。 URLが直接配置されると、 parse_urlはエラーを解析する場合があります。
URLに中国語またはその他の非ASCII文字が含まれている場合、URLを最初にエンコードする必要があります。そうしないと、 parse_urlが正しく解析されない場合があります。
例:
$url = "https://gitbox.net/search?query=天気予報";
$parts = parse_url($url);
echo $parts['query']; // コードを文字化けしたり、エラーを解析したりする可能性があります
正しい方法は、 urlencodeエンコードを使用して最初にパラメーターを照会することです。
$query = urlencode("天気予報");
$url = "https://gitbox.net/search?query=$query";
$parts = parse_url($url);
echo $parts['query']; // query=%E5%A4%A9%E6%B0%94%E9%A2%84%E6%8A%A5
スペースは、URLで%20または+としてエンコードする必要があります。 URLに直接スペースを含めると、 Parse_urlはスペースの後にコンテンツを切り捨てる場合があります。
例:
$url = "https://gitbox.net/search?keyword=hello world";
$parts = parse_url($url);
print_r($parts);
この時点で、 Parse_urlは、URLがキーワード= helloにのみ到達し、その後の世界は無視されると考えるでしょう。に変更する必要があります:
$url = "https://gitbox.net/search?keyword=hello%20world";
$parts = parse_url($url);
print_r($parts);
#は、URLのフラグメント識別子(フラグメント)を表すために使用されます。 #がURLに直接エンコードされていない場合、後続のコンテンツはフラグメントと見なされ、解析結果に影響する可能性があります。
例:
$url = "https://gitbox.net/page?name=abc#section2";
$parts = parse_url($url);
print_r($parts);
出力:
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /page
[query] => name=abc
[fragment] => section2
)
#がパラメーター値の一部である場合、 %23としてエンコードする必要があります。
URLに既にエンコードされた文字が含まれている場合、 parse_urlは自動的にデコードされないため、解析エラーが発生する可能性があります。特に、エンコードが不完全な場合、たとえば、 %2が最後のビットを欠いている場合、 parse_urlはエラーを報告します。
解決策は、すべてのパーセンテージコードが完全かつ有効であることを確認するか、最初にURLを検出して修正することです。
質問1:parse_urlはfalseまたは不完全な結果を返します<br> 考えられる理由は、URL形式が違法であるか、違法な文字が含まれていることです。 Filter_var($ url、filter_validate_url)を使用して、最初にURLの合法性を検証することをお勧めします。
質問2:一貫性のないエンコーディングは、クエリパラメーターの解析の混乱をもたらします<br> すべての特殊文字が正しくエンコードされていることを確認します。特にクエリ文字列とパスパーツ。
質問3:解析結果のクエリパーツは、キー価値のペアに分割されていません
Parse_urlは、URL構造の分割のみを担当し、クエリを配列に解析しません。 PARSE_STR関数と組み合わせることができます。
parse_str($parts['query'], $queryParams);
print_r($queryParams);
parse_urlを使用する前に、URL文字列が合法であり、特殊文字が正しくエンコードされていることを確認してください。
中国語および非ASCIIキャラクターはurlencodeでなければなりません。
スペース、 # 、 %などの特別なシンボルは、エンコードに特別に注意する必要があります。
クエリパラメーターの場合、 parse_strを使用してアレイにさらに解析できます。
解析の例外に遭遇したら、最初にURL形式を確認し、次にエンコードの問題をデバッグします。
上記の注意事項を習得すると、 Parse_urlを使用して複雑なキャラクターまたは特殊文字のURLを処理することができます。
$url = "https://gitbox.net/search?query=" . urlencode("天気予報#1");
$parts = parse_url($url);
print_r($parts);
if (isset($parts['query'])) {
parse_str($parts['query'], $queryParams);
print_r($queryParams);
}
このコードは、中国語と#文字の処理とクエリパラメーターの解析を示しています。