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

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

Jul 14, 2016 am 10:09 AM
defined direct php s フレーム ソースコード 読む

[php]  

<?php if ( !定義('BASEPATH')) exit('直接スクリプトアクセスは許可されません');  
/** 
* コードイグナイター
*
* 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 までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

CakePHP の日付と時刻

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

CakePHP ファイルのアップロード

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

CakePHP ルーティング

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP について話し合う

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

CakePHP プロジェクトの構成

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP クイックガイド

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法

See all articles