ホームページ >バックエンド開発 >PHPチュートリアル >CI フレームワークのソース コードの読み取り----------URI.php_PHP チュートリアル

CI フレームワークのソース コードの読み取り----------URI.php_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:09:14923ブラウズ

[php]  

/** 
* コードイグナイター
*
* PHP 5.1.6 以降用のオープンソース アプリケーション開発フレームワーク
*
* @package CodeIgniter
* @author ExpressionEngine 開発チーム
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
* @license http://codeigniter.com/user_guide/license.html
* @link http://codeigniter.com
* @since バージョン 1.0
* @filesource
 */
// ----------------------------------------------- ------------------------
/** 
* URI クラス
*
* URI を解析し、ルーティングを決定します
*
* @package CodeIgniter
* @subpackage ライブラリ
* @カテゴリー URI
* @author ExpressionEngine 開発チーム
* @link http://codeigniter.com/user_guide/libraries/uri.html
 */
クラス CI_URI {
/**
* キャッシュされた URI セグメントのリスト
* キャッシュ URI セグメント リスト
* @var 配列
* @アクセス公開
*/
var $keyval = array();  
/**
* 現在の URI 文字列
* 現在の URI 文字列
* @var 文字列
* @アクセス公開
*/
var $uri_string;  
/**
* URI セグメントのリスト
* URIセグメントリスト
* @var 配列
* @アクセス公開
*/
var $segments = array();  
/**
* 再インデックスされた URI セグメントのリスト
* 0 ではなく 1 から始まります
* rui セグメント リストのインデックスを 1 から再インデックスします
* @var 配列
* @アクセス公開
*/
var $rsegments = array();  
/** 
* コンストラクター
*
* $RTR オブジェクトを単純にグローバル化します。  正面
* Router クラスを早い段階でロードするため、利用できません
* 通常は他のクラスと同様です。 
*
* @access public
     */
関数 __construct()
{
$this->config =&load_class('Config', 'core');  
log_message('debug', "URI クラスが初期化されました");  
}
// ----------------------------------------------- ---------------------
/** 
* URI 文字列を取得します
*
* @access プライベート
* @return string
     */
関数 _fetch_uri_string()
{
// 以下の uri_protocol は config.php のエリアにある 1 つの構成です、
// これは问你用哪种方式で检测ウリの情報の意思、
// デフォルトは AUTO、自動検出です。つまり、検出されるまで、またはすべての方法が検出されるまで、さまざまな方法で検出されます。 。
if (strtoupper($this->config->item('uri_protocol')) == 'AUTO')
using using _ 各 // 主にコマンドライン、request_uri、path_info、query_string など、さまざまなメソッドを試し始めます。
️メソッド $this->_set_uri_string($str) は以下で何度も登場しますが、このメソッドは他に何もせず、$str を
に渡すだけです。 剪 // $ this-& gt; 値をフィルターしてトリムします。ここでは、しばらく代入として理解できます。
是 // スクリプトがコマンド ライン モードで実行されている場合、パラメータは $ _Server ['argv'] によって渡されます。以下
// $this->_parse_cli_args(); は、ニーズを満たすルーティングに関連するパラメーターを取得するためのものです
// コマンドラインを使用してスクリプトを実行しない場合は、当面は以下を無視してかまいません。
// 現時点では、URI クラスが関数 php_sapi_name() を使用してさまざまな環境をテストしていることがわかりました
C // Apache 環境での出力結果は「Apache2handler」です。
から s まで 1 ‐ ‐ 命 // コマンドラインモードで実行した場合、出力結果は次のようになります: "CLI"
if (php_sapi_name() == 'cli' または定義済み('STDIN'))
$this->_set_uri_string($this->_parse_cli_args());
}
'// まず request_uri を試してみましょう。これはほとんどのサイトで機能します
持っている
if ($uri = $this->_detect_uri())
to
$this->_set_uri_string($uri);
}
using through use ’s ’ through ’s’ through ホルダー using through ’s ’ through ’ through ‐to ‐ ‐ ‐ ‐ および
// 注: 一部のサーバーでは getenv() に問題があるようですので、2 つの方法でテストします
getenv('PATH_INFO')
$path = (isset($_SERVER['PATH_INFO'])) $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
if (trim($path, '/') != '' && $path != "/".SELF)
$this->_set_uri_string($path);
}
'' 's’ s ’s -1を使用して、外出を通過して外出を通して外出を介して、sのsのsのsです。
// $_SERVER['PATH_INFO'] が見つからない場合は、QUERY_STRING を使用します
$path = (isset($_SERVER['QUERY_STRING'])) $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
if (trim($path, '/') != '')
$this->_set_uri_string($path);
}
️ // 最後の努力として、$_GET 配列を使用してみましょう
// PATH_INFO も QUERY_STRING も見つからない場合は、$_GET のみを使用できます
if (is_array($_GET) && count($_GET) == 1 && Trim(key($_GET), '/') != '')
$this->_set_uri_string(key($_GET));
}
を使用して を介して ' ' を介して ' を介して ' を介して ' を介して ' を介して ' を介して ' を介して ' を介して ' を介して ' を介して ' を介して ' ' を介して​ ​ ​
//
$this->uri_string = '';
}
//# 。 。
$uri = strtoupper($this->config->item('uri_protocol'));
️ .さまざまな方法に
if ($uri == 'REQUEST_URI')
$this->_set_uri_string($this->_detect_uri());
}
elseif ($uri == 'CLI')
$this->_set_uri_string($this->_parse_cli_args());
}
// 定義した uri_protocol が AUTO REQUEST_URI CLI の 3 つのメソッドの外にある場合は、次の段落を実行します。
$path = (isset($_SERVER[$uri])) $_SERVER[$uri] : @getenv($uri);
$this->_set_uri_string($path);
}
// ----------------------------------------------- --- --------------------------
/** 
* URI 文字列を設定します
*
* @access public
* @param string
* @return string
     */
関数 _set_uri_string($str)
{
// 制御文字を除外します
// フィルター文字列のremove_invisible_characters関数はcommon.phpにあります
$str = Remove_invisible_characters($str, FALSE);
// URI にスラッシュのみが含まれている場合は、それを強制終了します
串 // 文字列に 1 つしか含まれていない場合は、空になります
$this->uri_string = ($str == '/') '' : $str;
}
// ----------------------------------------------- --- --------------------------
/**
* URIを検出します
* 検索 URI
* この関数は自動的に URI を検出し、クエリ文字列を修正します
* 必要に応じて。
* 必要に応じて、この関数は自動的に URI を見つけてクエリ文字列を修正します。
*
*@アクセス非公開
* @戻り文字列
*/
プライベート関数 _detect_uri()
{
// 2 つの値のいずれかが欠落している場合は、戻ります (2 つの変数は Web サーバーから取得されます。特別なサーバー プログラムに遭遇した場合、これは空になる可能性があります。)
if ( ! isset($_SERVER['REQUEST_URI']) OR ! isset($_SERVER['SCRIPT_NAME']))
戻る '';
}
// URIを取得します
$uri = $_SERVER['REQUEST_URI']
if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0)
toに
$uri = substr($uri, strlen($_SERVER['SCRIPT_NAME']));
}
// ここでの関数は、$_SERVER['SCRIPT_NAME'] が
に置き換えられることを除いて、上記と同じです。
// ディレクトリ名($_SERVER['SCRIPT_NAME'])
elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0)
$uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME'])));
}
// このセクションでは、URI を必要とするサーバー上でも、
// クエリ文字列 (Nginx) に含まれる正しい正しい
// URI が見つかり、QUERY_STRING サーバー変数と $_GET 配列も修正されます。
// この部分は、Nginx サーバー上でも URI が正しく見つかるようにし、QUERY_STRING サーバーと $_GET 配列も修正します。
$ // $ URI の最初の 2 文字は?/
if (strncmp($uri, '?/', 2) === 0)
持っている
$uri = substr($uri, 2);
}
を使用して文字列を分割します
$parts = preg_split('#?#i', $uri, 2);
$uri = $parts[0]
;
// 上記の通常のルールによって 2 つのセグメントに分割できる場合は、query_string?
の形式でのルートアクセス
if (isset($parts[1]))
$_SERVER['QUERY_STRING'] = $parts[1];
// 関数はクエリ文字列を $_GET 変数に解析します。
parse_str($_SERVER['QUERY_STRING'], $_GET);
}
その他
$_SERVER['QUERY_STRING'] = '';
$_GET = array();
}
の形式でのルートアクセス
// したがって、この時点で $parts[0] は次の 2 つの可能性と等しく、同時に
P // $ 部分を介して取得したい情報を返すことができます [1]。
// 渡されたルーティング情報は直接返すこともできます。
if ($uri == '/' || emptyempty($uri))
'/' を返します。
}
//この URL のパス部分を返します。
$uri = parse_url($uri, PHP_URL_PATH);
// URI の最終的なクリーニングを行って、それを返します
を使用して を使用して -‐
return str_replace(array('//', '../'), '/', trim($uri, '/'));
}
// ----------------------------------------------- --- --------------------------
/**
* cli 引数を解析する
* cli パラメータを解析します
* 各コマンドライン引数を URI セグメントであると仮定します。
* これをコマンドラインで実行する場合
* php d:/wamp/www/CodeIgniter/index.php ようこそインデックス
* _parse_cli_args() は /welcome/index の文字列を返します
*
*@アクセス非公開
* @戻り文字列
*/
プライベート関数 _parse_cli_args()
{
// コマンドラインモードでの実行時に渡されたパラメータを返します。
// 最初のパラメータは現在のファイル名であるため、2 番目のパラメータから開始して取得することになります。
$args = array_slice($_SERVER['argv'], 1);
// $this->uri_string は文字列であるため、「/」文字列で連結された文字列を返します。
$args ? '/' . implode('/', $args) : '';
}
// ----------------------------------------------- --- --------------------------
/**
* 悪意のある文字のセグメントをフィルタリングします
* 不正な文字をフィルタリングします
*@アクセス非公開
* @パラメータ文字列
* @戻り文字列
*/
関数_filter_uri($str)
{
if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
// PHP 5.3 の preg_quote() は - をエスケープするため、 str_replace() と preg_quote() への - の追加は後方を維持するためです
// 互換性 互換性。多くの人は、 allowed_uri_chars 内の文字が正規表現パターンとしてどのように解析されるかを知りません
// おそらく PHP5.3.0 で必要に応じて文字数が増えたためと思われます。 したがって、ここで str_replace() を使用する場合は、エスケープするために preg_quote() を追加する必要があります -
if ( ! preg_match("|^[".str_replace(array('\-', '-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '- '))."]+$|i", $str))
show_error('送信された URI には許可されていない文字が含まれています。', 400);
}
}
// プログラムの文字をエンティティに変換します
$bad = array('$', '(', ')', '%28', '%29');  
$good = array('$', '(', ')', '(', ')');  
return str_replace($bad, $good, $str);  
}
// ----------------------------------------------- ---------------------
/**
* 必要に応じて URL からサフィックスを削除します
* * // URL からカスタムサフィックスを削除します。
*@アクセス非公開
* @return void
*/
function _remove_url_suffix()
{
if ($this->config->item('url_suffix') != "")
{
$this->uri_string = preg_replace("|".preg_quote($this->config->item('url_suffix'))."$|", "", $this->uri_string);  
}
}
// ----------------------------------------------- ---------------------
/**
* URI セグメントを分解します。
個々のセグメントは次のようになります。
* $this->segments 配列に保存されます。
* URI をセグメントに分割し、各セグメントをフィルタリングして $this->segments[] に保存します
*@アクセス非公開
* @return void
*/
function _explode_segments()
{
foreach (explode("/", preg_replace("|/*(.+?)/*$|", "\1", $this->uri_string)) as $val)
{
// セキュリティのためにセグメントをフィルターします
$val = trim($this->_filter_uri($val));  
if ($val != '')
{
$this->segments[] = $val;  
}
}
}
// ----------------------------------------------- ---------------------
/**
* セグメントの再インデックス セグメントの再インデックス
* を指定すると、送信セグメントが添字 1 から保存されます。これにより、セグメント配列と実際のセグメントの間に 1:1 の関係があるため、使いやすくなります
* この関数は、$this->segment 配列のインデックスを再作成します。
* 0 ではなく 1 から始まります。そうすることで、
が簡単になります。
*
があるため、$this->uri->segment(n) のような関数を使用します
* セグメント配列と実際のセグメント間の 1:1 の関係。
*
*@アクセス非公開
* @return void
*/
function _reindex_segments()
{
array_unshift($this->segments, NULL);  
array_unshift($this->rsegments, NULL);  
unset($this->segments[0]);  
unset($this->rsegments[0]);  
}
// ----------------------------------------------- ---------------------
/**
* URI セグメントを取得する
* URI セグメントを取得します
* この関数は、指定された番号に基づいて URI セグメントを返します
* この関数は、指定された番号に基づいて URI セグメントを返します
* @アクセス公開
* @param 整数
* @param bool
* @戻り文字列
*/
関数セグメント($n, $no_result = FALSE)
{
return ( ! isset($this->segments[$n])) $no_result : $this->segments[$n];
}
// ----------------------------------------------- --- --------------------------
/**
* URI「ルーティングされた」セグメントを取得します
* ルート決定後、一定区間を折り返します
* この関数は、再ルーティングされた URI セグメントを返します (ルーティング ルールが使用されていると仮定します)
* 指定された番号に基づいて、ルーティングがない場合、この関数は
を返します。
* $this->segment() と同じ結果
* この関数は、指定された番号に基づいてルーティングされた URI セグメントを返します (ルーティング ルールが使用されていると仮定します)
* まだルーティングされていない場合、この関数は $this->segment() と同じになります
*
* @アクセス公開
* @param 整数
* @param bool
* @戻り文字列
*/
関数 rsegment($n, $no_result = FALSE)
{
return ( ! isset($this->rsegments[$n])) $no_result : $this->rsegments[$n];
}
// ----------------------------------------------- --- --------------------------
/**
* Generate は URI 文字列からキーと値のペアを生成します
* URI 文字列に基づいてキーと値のペアの配列を生成します
*
* この関数は、
から始まる URI データの連想配列を生成します
* によって提供されます。 。 。たとえば、これが URI の場合:
*
* * example.com/user/search/name/joe/location/イギリス/性別/男性
*
* この関数を使用して、このプロトタイプで配列を生成できます:
*
* 配列 (
場所 => 英国
* * 性別 => 男性
)
* この関数は、uri セグメントから連想配列を生成します
* 例: URI が次のような場合
* example.com/user/search/name/joe/location/イギリス/性別/男性
* するとこのようなプロトタイプが生成されます
* 配列 (
所在地 => 英国
* * 性別 => 男性
)
* @アクセス公開
* @param integer 開始セグメント番号
* @param array デフォルト値の配列
* @return 配列
*/
関数 uri_to_assoc($n = 3, $default = array())
{
return $this->_uri_to_assoc($n, $default, 'segment');  
}
/**
* 再ルーティングされたセグメント配列を使用するだけで、上記とまったく同じです
* ルーティングされたセグメント配列をフラッシュすることを除いて、前の関数とまったく同じです (3 番目のパラメーターに注意してください)
* @アクセス公開
* @param integer 開始セグメント番号
* @param array デフォルト値の配列
* @return 配列
*
*/
function ruri_to_assoc($n = 3, $default = array())
{
return $this->_uri_to_assoc($n, $default, 'rsegment');  
}
// ----------------------------------------------- ---------------------
/**
* URI 文字列または再ルーティングされた URI 文字列からキーと値のペアを生成します
* URI 文字列または再ルーティングされた URI 文字列に基づいてキーと値のペアの配列を生成します
*@アクセス非公開
* @param integer 開始セグメント番号 開始セグメント番号
* @param array デフォルト値の配列
* @param 使用する配列を表す文字列
* @return 配列
*/
function _uri_to_assoc($n = 3, $default = array(), $that = 'segment')
{
// セグメント数グループは再ルート可能ではありません。
if ($that == 'セグメント')
{
$total_segments = 'total_segments';  
$segment_array = 'segment_array';  
}
その他
{
$total_segments = 'total_rsegments';  
$segment_array = 'rsegment_array';  
}
// $n は不是一数字
if ( ! is_numeric($n))
{
$default を返します。  
}
// 缓存ウリ段列表中に存在する$nこのキー
if (isset($this->keyval[$n]))
{
return $this->keyval[$n];  
}
// 总段数は $n より小さい
if ($this->$total_segments()
{
if (count($default) == 0)
{
return array();  
}
$retval = array();  
foreach ($default として $val)
{
$retval[$val] = FALSE;  
}
$retval を返します。  
}
$segments = array_slice($this->$segment_array(), ($n - 1));  
$i = 0;  
$lastval = '';  
$retval = array();  
foreach ($segments として $seg)
{
if ($i % 2)
{
$retval[$lastval] = $seg;  
}
その他
{
$retval[$seg] = FALSE;  
$lastval = $seg;  
}
$i++;  
}
if (count($default) > 0)
{
foreach ($default として $val)
{
if ( ! array_key_exists($val, $retval))
{
$retval[$val] = FALSE;  
}
}
}
// 再利用のために配列をキャッシュします
// 缓存数组一遍重用
$this->keyval[$n] = $retval;  
$retval を返します。  
}
// ----------------------------------------------- ---------------------
/**
* 連想配列配列から URI 文字列を生成します
* 連想配列に基づいて URI 文字列を生成します
*
* @アクセス公開
* @param array キー/値の連想配列
* @return 配列
*/
関数 assoc_to_uri($array)
{
$temp = array();  
foreach ((array)$array as $key => $val)
{
$temp[] = $key;  
$temp[] = $val;  
}
return implode('/', $temp);  
}
// ----------------------------------------------- ---------------------
/**
* URI セグメントを取得し、末尾のスラッシュを追加します
* URI セグメントを取得し、/ を追加します
*
* @アクセス公開
* @param 整数
* @パラメータ文字列
* @戻り文字列
*/
functionlash_segment($n, $where = 'trailing')
{
return $this->_slash_segment($n, $where, 'segment');  
}
// ----------------------------------------------- ---------------------
/**
* URI セグメントを取得し、末尾のスラッシュを追加します
* 获取一个已经路由的ウリ段并および追加/
* @access public
* @param 整数
* @param string
* @return string
*/
functionlash_rsegment($n, $where = 'trailing')
{
return $this->_slash_segment($n, $where, 'rsegment');  
}
// ----------------------------------------------- ---------------------
/** 
* URI セグメントを取得し、末尾のスラッシュを追加する - ヘルパー関数
*
* @access プライベート
* @param 整数
* @param string
* @param string
* @return string
     */
function _slash_segment($n, $where = 'trailing', $that = 'segment')
{
$leading = '/';  
$trailing = '/';  
if ($where == 'trailing')
{
$leading = '';  
}
elseif ($where == '先頭')
{
$trailing = '';  
}
return $leading.$this->$that($n).$trailing;  
}
// ----------------------------------------------- ---------------------
/**
* セグメント配列
* セグメント配列を取得します
* @アクセス公開
* @return 配列
*/
関数segment_array()
{
$this-> セグメントを返します。  
}
// ----------------------------------------------- ---------------------
/**
* ルーティングされたセグメント配列
* ルーティングされたセグメント配列を取得します
* @アクセス公開
* @return 配列
*/
関数 rsegment_array()
{
$this->rsegments; を返します。  
}
// ----------------------------------------------- ---------------------
/**
* セグメントの総数
* セグメントの総数を取得します
* @アクセス公開
* @return integer
*/
関数 total_segments()
{
return count($this->segments);  
}
// ----------------------------------------------- ---------------------
/**
* ルーティングされたセグメントの総数
* ルーティングされたセグメントの総数を取得します
* @アクセス公開
* @return integer
*/
関数 total_rsegments()
{
return count($this->rsegments);  
}
// ----------------------------------------------- ---------------------
/** 
* URI 文字列全体を取得します
*
* @access public
* @return string
     */
関数 uri_string()
{
return $this->uri_string;  
}
// ----------------------------------------------- ---------------------
/** 
* 再ルーティングされた URI 文字列全体を取得します
* www.2cto.com
* @access public
* @return string
     */
関数 ruri_string()
{
return '/'.implode('/', $this->rsegment_array());  
}
}
// END URI クラス
/* ファイル URI.php の終わり */
/* 場所: ./system/core/URI.php */

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477684.html技術記事 [php] ?php if ( !定義(BASEPATH)) exit(スクリプトへの直接アクセスは許可されません); /** * CodeIgniter * * PHP 5.1.6 以降用のオープンソース アプリケーション開発フレームワーク * * @packag...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。