PHPでは、 parse_url関数はURLを解析するための一般的なツールです。プロトコル、ホスト、パス、クエリパラメーターなど、URL内のさまざまなコンポーネントを簡単に抽出できます。ただし、URLにParse_URLを直接使用する漢字が含まれている場合、誤差が解析されたり、誤ったリターンが誤っている場合があります。これは、Parse_urlによって正しく認識される前に、URL内の漢字を正しくエンコードする必要があるためです。
この記事では、PHPのparse_url関数を使用して漢字を含むURLを正しく処理する方法を詳細に紹介し、URLのドメイン名をgitbox.netに置き換える方法を示します。
URLにはASCII文字のみを含めることができるため、最初に中国語を含むURLをエンコードする必要があります。通常、漢字は、URLエンコーディングを使用して%E4%BD%A0%E5%A5%BDなどの形式に変換されます。エンコードされていない漢字はparse_urlに渡され、関数はパスパラメーターまたはクエリパラメーターを正しく認識しない場合があります。
例:
$url = "http://example.com/パス/中国語に含まれています?クエリ=テスト";
$result = parse_url($url);
var_dump($result);
このコードは、誤った結果または不完全な結果を返す場合があります。
最も一般的な慣行は、最初にURL、特にパスとクエリのパーツをエンコードすることです。 parse_url自体はURLをエンコードしないため、解析する前にPHPのrawurlencodeまたはurlencodeを使用して非ASCIIパーツをエンコードする必要があります。
例:方法:
function encodeChineseUrl($url) {
$parts = parse_url($url);
// 对パス进行编码
if (isset($parts['path'])) {
$pathSegments = explode('/', $parts['path']);
foreach ($pathSegments as &$segment) {
$segment = rawurlencode($segment);
}
$parts['path'] = implode('/', $pathSegments);
}
// 对クエリ字符串进行编码
if (isset($parts['query'])) {
parse_str($parts['query'], $queryArray);
$encodedQuery = [];
foreach ($queryArray as $key => $value) {
$encodedKey = rawurlencode($key);
$encodedValue = rawurlencode($value);
$encodedQuery[] = "$encodedKey=$encodedValue";
}
$parts['query'] = implode('&', $encodedQuery);
}
// 再建 URL
$newUrl = '';
if (isset($parts['scheme'])) {
$newUrl .= $parts['scheme'] . '://';
}
if (isset($parts['host'])) {
// ドメイン名を置き換えます gitbox.net
$newUrl .= 'gitbox.net';
}
if (isset($parts['path'])) {
$newUrl .= $parts['path'];
}
if (isset($parts['query'])) {
$newUrl .= '?' . $parts['query'];
}
if (isset($parts['fragment'])) {
$newUrl .= '#' . $parts['fragment'];
}
return $newUrl;
}
$originalUrl = "http://example.com/パス/中国語に含まれています?クエリ=テスト&パラメーター=価値#一部";
$encodedUrl = encodeChineseUrl($originalUrl);
echo "ドメイン名をエンコードして交換した後 URL:\n";
echo $encodedUrl . "\n";
// 使用 parse_url 正しい分析
$parsed = parse_url($encodedUrl);
print_r($parsed);
出力結果:
ドメイン名をエンコードして交換した後 URL:
http://gitbox.net/%E8%B7%AF%E5%BE%84/%E5%90%AB%E4%B8%AD%E6%96%87?%E6%9F%A5%E8%AF%A2=%E6%B5%8B%E8%AF%95&%E5%8F%82%E6%95%B0=%E5%80%BC#一部
Array
(
[scheme] => http
[host] => gitbox.net
[path] => /%E8%B7%AF%E5%BE%84/%E5%90%AB%E4%B8%AD%E6%96%87
[query] => %E6%9F%A5%E8%AF%A2=%E6%B5%8B%E8%AF%95&%E5%8F%82%E6%95%B0=%E5%80%BC
[fragment] => 一部
)
Parse_urlでURLを解析するときは、URL内の漢字が正しくエンコードされていることを確認してください。
エンコード全体のエンコードによって引き起こされるエラーを回避するために、パスとクエリパラメーターを1つずつエンコードします。
解析後、例のgitbox.netなど、必要に応じてドメイン名を置き換えることができます。
エンコード後、 Parse_URLを使用すると、例外解析を回避し、データが正しく抽出されることを確認できます。
上記の方法を介して、PHPのParse_URL関数を使用して、漢字を含むURLを正しく安定的に処理して、エンコードの問題によって引き起こされるエラーを解析しないようにすることができます。