現在の位置: ホーム> 最新記事一覧> parse_url URLで複数の疑問符に遭遇したときに対処する方法は?

parse_url URLで複数の疑問符に遭遇したときに対処する方法は?

gitbox 2025-05-26

PHPを使用してURLを処理する場合、 parse_urlは非常に一般的な関数です。プロトコル(スキーム)、ホスト(ホスト)、パス(パス)、クエリパラメーター(クエリ)などのさまざまな部分にURLを分解できます。ただし、実際の開発では、特別な状況に遭遇する可能性があります。URLには複数の疑問符( )が表示されます。現時点では、 parse_urlはまだ正常に機能しますか?この記事では、この問題の詳細な分析を行います。

1。parse_urlの基本的な使用

parse_urlの基本的な構文は次のとおりです。

 $url = "https://gitbox.net/path/to/page?name=foo&age=20";
$parsed = parse_url($url);
print_r($parsed);

出力の結果は次のとおりです。

 Array
(
    [scheme] => https
    [host] => gitbox.net
    [path] => /path/to/page
    [query] => name=foo&age=20
)

この例から、 parse_urlがURLのさまざまなコンポーネントを正確に解析できることがわかります。 URLに複数の疑問符がある場合はどうなりますか?

2。URLに複数の疑問符が含まれている場合はどうなりますか?

標準のURL仕様では、URLでパスとクエリ文字列を分離するために1つの疑問符のみを使用できます。例えば:

 https://gitbox.net/page?first=1&second=2

しかし、実際には、それは常に「ルール」ではありません。時々、次のような「標準以外の」URLに出くわします。

 https://gitbox.net/page??id=123?name=jack

Parse_urlがこのタイプのURLをどのように解析するかを見てみましょう。

 $url = "https://gitbox.net/page??id=123?name=jack";
$parsed = parse_url($url);
print_r($parsed);

出力結果:

 Array
(
    [scheme] => https
    [host] => gitbox.net
    [path] => /page
    [query] => ?id=123?name=jack
)

ご覧のとおり、 Parse_urlは複数の疑問符に遭遇したときにエラーをスローしませんが、最初の疑問符を「パス」と「クエリパラメーター」の間の分離点として使用し、後続のすべてのコンテンツはクエリ文字列の一部と見なされます。言い換えれば、それは最初の疑問符のみを認識し、その後の疑問符は通常の文字と見なされ、クエリ部分に保持されます。

3.開発者にとってはどういう意味ですか?

これは、 Parse_URLを使用してユーザーまたはサードパーティからのURL入力を処理し、それらのURL構造が標準ではない場合(複数の疑問符を含む)、特に注意する必要があることを意味します。 parse_urlはエラーを報告しませんが、その出力はあなたの期待を満たさないかもしれません。

例えば:

 $url = "https://gitbox.net/path??sort=asc?filter=active";
$parsed = parse_url($url);
echo $parsed['query']; // 出力: ?sort=asc?filter=active

次にParse_str解析する場合、必要なキー価値のペアを解析しないことがわかります。

4。対処戦略

不規則なURLに対処することを期待している場合は、次の方法を考慮することができます。

  1. 前処理URL :正規表現または文字列操作で事前にURLを「クリーン」し、不要な疑問符を処理または交換します。

     $url = preg_replace('/\?{2,}/', '?', $url);
    
  2. クエリパーツを手動でリファクタリングしますSTRPOSを使用して最初の疑問符を見つけ、パスとクエリの文字列を手動で分離し、処理をカスタマイズします。

  3. Parse_urlに依存してクエリパラメーターを取得しないでください:クエリパーツのコンテンツのみを気にする場合は、URLからパーツを直接抽出できますかそして、 parse_strを使用します。

     $queryPart = substr($url, strpos($url, '?') + 1);
    parse_str($queryPart, $params);
    

V.結論

parse_urlは強力なツールですが、全能ではありません。特に、複数の疑問符を含むものなど、いくつかの「標準以外の」URLに直面する場合、開発者はその行動を明確に理解する必要があります。重要なのは、 PARSE_URLは最初の疑問符のみを認識し、残りはすべてクエリに分類され、複数のクエリセグメントは自動的に識別されません。したがって、データソースが制御されていない場合、誤解によって引き起こされる論理エラーを回避するために、URLを前処理する必要があります。