PHP_URL解析 の変更点 - アールメカブ

アールメカブ


PHP_URL解析 の変更点


[[Programming]]

[[ここ:http://phpspot.net/php/pg%82t%82q%82k%82%F0%89%F0%90%CD%82%B7%82%E9.html]]から引用

parse_url を使う

 $hash = parse_url("http://www.yahoo.co.jp/index.html");

$hash に指定されたURLが分解された連想配列が代入される

"host", "port", "user", "pass", "path", "query", "fragment"

それぞれ要素に分割される

 $hash["host"] には www.yahoo.co.jp が入ります。
その他項目についても同様に連想配列としてデータが入る.


------
*詳細情報 [#rff8b013]
[[詳細情報はここ:http://www.makizou.com/php/function.parse-url.html]]

parse_url

(PHP 4, PHP 5)

parse_url ― URL を解釈し、その構成要素を返す
説明
mixed parse_url ( string $url [, int $component = -1 ] )

この関数は、URL の様々な構成要素のうち特定できるものに関して 連想配列にして返します。

この関数は、指定された URL が有効かどうかを調べるためのもの ではなく、単に URL を上で示した 要素に分解するだけのものです。不完全な URL であっても受け入れられますし、 そのような場合でも parse_url() は可能な限り 正しく解析しようとします。
パラメータ

url

    パースする URL。無効な文字は _ に置換されます。

component

    PHP_URL_SCHEME、 PHP_URL_HOST、PHP_URL_PORT、 PHP_URL_USER、PHP_URL_PASS、 PHP_URL_PATH、PHP_URL_QUERY あるいは PHP_URL_FRAGMENT のうちのいずれかを指定し、 特定の URL コンポーネントのみを 文字列で取得するようにします。

返り値

完全におかしな形式の URL については、parse_url() は FALSE を返し、E_WARNING を発生します。それ以外の場合は 連想配列が返され、その中には以下の要素(のうち少なくともひとつ)が含まれます。

    * scheme - 例: http
    * host
    * port
    * user
    * pass
    * path
    * query - クエスチョンマーク ? 以降
    * fragment - ハッシュマーク # 以降

component が指定されている場合、結果は array ではなく文字列で返されます。
変更履歴

バージョン 	説明
5.1.2 	パラメータ component が追加されました。

例1 parse_url() の例

 <?php
  $url = 'http://username:password@hostname/path?arg=value#anchor';
 
  print_r(parse_url($url));
 ?>

上の例の出力は以下となります。

 Array
 (
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
 )

注意: この関数は相対 URL では動作しません。

注意: parse_url() は URL をパースするための関数であり、 URI をパースするものではありません。しかし、PHP の後方互換性を満たすため、 例外として file:// スキームについては 3 重スラッシュ(file:///...) が認められています。他のスキームにおいては、これは無効な形式となります。

参考

 * pathinfo() - ファイルパスに関する情報を返す
 * parse_str() - 文字列を処理し、変数に代入する
 * http_build_query() - URL エンコードされたクエリ文字列を生成する
 * dirname() - パス中のディレクトリ名の部分を返す
 * basename() - パス中のファイル名の部分を返す


---------
* urlencode されていないクエリ [#s79da9c0]

[[:http://www.xugj.org/modules/d3forum/index.php?topic_id=754]]

"Legacy_Controller.class.php" と
"Legacy_PublicControllerStrategy.class.php" にて、$_SERVER['REQUEST_URI'] を parse_url() で処理しているのですが、parse_url() では URI のみでは、正常に処理できない場合があるようです。

例えば、GETクエリーが "XOOPS_URL/index.php?http://" であった場合に、parse_url($_SERVER['REQUEST_URI']) は失敗して FALSE を返します。("http://" が URLエンコードされていれば問題はない。)

そこで、自分なりに次のように変更してみたところ、なんとなく上手くいっているようです。

Legacy_Controller.class.php, Line:383 -

//$requestPathInfo = parse_url($_SERVER['REQUEST_URI']);
//$requestPath = isset($requestPathInfo['path']) ? urldecode($requestPathInfo['path']) : '';
$requestPathInfo = explode('?', $_SERVER['REQUEST_URI']);
$requestPath = urldecode($requestPathInfo[0]);


Legacy_PublicControllerStrategy.class.php, Line: 43 -

//$pathArray = parse_url(xoops_getenv('REQUEST_URI'));
//$mid = preg_match("#(/index\.php|/)$#i", @$pathArray['path']) ? -1 : 0;
$pathArray = explode('?', xoops_getenv('REQUEST_URI'));
$mid = preg_match("#(/index\.php|/)$#i", $pathArray[0]) ? -1 : 0;