9

を使用するように言われる前にparse_url、これでは十分とは言えず、バグが多すぎます。ここには、URL の解析に関する多くの質問がありますが、ほとんどすべてが特定のクラスの URL のみを解析するか、そうでなければ不完全です。

私は、ブラウザーが遭遇する可能性のあるすべての URL を確実に処理する、PHP での決定的な RFC 準拠の URL パーサーを探しています。これには、次のものが含まれます。

  • ページ内リンク#,#title
  • ページ相対 URLblah/thing.php
  • サイト相対 URL/blah/thing.php
  • 匿名プロトコル URL//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js
  • Callto URLcallto:+442079460123
  • ファイル URLfile:///Users/me/thisfile.txt
  • Mailto URL mailto:user@example.com?subject=hellomailto:?subject=hello

通常のすべてのスキーム/認証/ドメイン/パス/クエリ/フラグメントなどをサポートし、それらすべての要素を配列に分割し、相対/スキーマレス URL 用の追加のフラグを付けます。理想的には、同じ要素をサポートする URL 再構成子 (http_build_url など) が付属していて、検証も適用したいと考えています (つまり、URL が無効である場合に最適な解釈を行うことができるはずですが、フラグを立てる必要があります)。ブラウザと同じように)。

この回答には、そのような獣への興味をそそるフェルマー スタイルの参照が含まれていましたが、実際にはどこにも行きません。

私はすべての主要なフレームワークを調べましたが、parse_url の周りにシン ラッパーしか提供していないようです。

では、そんなものは存在するのでしょうか。

4

1 に答える 1

3

バグがいくつあるかはわかりませんparse_url()が、これが役立つかもしれません:

「first-match-wins」アルゴリズムは、POSIX 正規表現で使用される「貪欲な」曖昧さ回避方法と同じであるため、URI 参照の潜在的な 5 つのコンポーネントを解析するために正規表現を使用することは自然で一般的です。

次の行は、整形式の URI 参照をそのコンポーネントに分解するための正規表現です。

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
 12            3  4          5       6  7        8 9

ソース: https://www.rfc-editor.org/rfc/rfc3986#page-51

場所を次のように分類します。

$2 - scheme
$4 - host
$5 - path
$6 - query string
$8 - fragment

再構築するには、次を使用できます。

$1 . $3 . $5 . $6 . $8
于 2012-10-02T09:34:39.207 に答える