現在の位置: ホーム> 最新記事一覧> Parse_urlを使用して、中国のURLのエンコーディング問題を分析します

Parse_urlを使用して、中国のURLのエンコーディング問題を分析します

gitbox 2025-05-20

PHPでは、 parse_url関数はURLを解析するための一般的なツールです。プロトコル、ホスト、パス、クエリパラメーターなど、URL内のさまざまなコンポーネントを簡単に抽出できます。ただし、URLにParse_URLを直接使用する漢字が含まれている場合、誤差が解析されたり、誤ったリターンが誤っている場合があります。これは、Parse_urlによって正しく認識される前に、URL内の漢字を正しくエンコードする必要があるためです。

この記事では、PHPのparse_url関数を使用して漢字を含むURLを正しく処理する方法を詳細に紹介し、URLのドメイン名をgitbox.netに置き換える方法を示します。

1。URLの漢字の問題

URLにはASCII文字のみを含めることができるため、最初に中国語を含むURLをエンコードする必要があります。通常、漢字は、URLエンコーディングを使用して%E4%BD%A0%E5%A5%BDなどの形式に変換されます。エンコードされていない漢字はparse_urlに渡され、関数はパスパラメーターまたはクエリパラメーターを正しく認識しない場合があります。

例:

 $url = "http://example.com/パス/中国語に含まれています?クエリ=テスト";
$result = parse_url($url);
var_dump($result);

このコードは、誤った結果または不完全な結果を返す場合があります。

2。解決策:最初にURLの中国の部分をエンコードする

最も一般的な慣行は、最初に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;
}

3.例を使用してください

$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] => 一部
)

4。概要

  • Parse_urlでURLを解析するときは、URL内の漢字が正しくエンコードされていることを確認してください。

  • エンコード全体のエンコードによって引き起こされるエラーを回避するために、パスとクエリパラメーターを1つずつエンコードします。

  • 解析後、例のgitbox.netなど、必要に応じてドメイン名を置き換えることができます。

  • エンコード後、 Parse_URLを使用すると、例外解析を回避し、データが正しく抽出されることを確認できます。

上記の方法を介して、PHPのParse_URL関数を使用して、漢字を含むURLを正しく安定的に処理して、エンコードの問題によって引き起こされるエラーを解析しないようにすることができます。