目次
正则表达式 - ThinkPHP 这一段正则是不是写错了?/{|(w+)}/
Jun 06, 2016 pm 08:42 PM
php
thinkphp
正規表現
使用ThinkPHP3.2.2,阅读到一文件中有一行这样的代码:
<code># 文件 ThinkPHP/Library/Behavior/ReadHtmlCacheBehavior.class.php # 方法 # {|FUN} 单独使用函数 $rule = preg_replace_callback('/{|(\w+)}/', function($match){return $match[1]();},$rule); </code>
ログイン後にコピー
ログイン後にコピー
1)这个里面 /{|(\w+)}/这一段是不是写错了?
花括号 { },分隔符 | 不是正则的吗?但是却运行正常。
$rule 的值示例:
<code>$rule = '{:module}/{:controller}/{:action}/{$_SERVER.REQUEST_URI|md5}'; </code>
ログイン後にコピー
ログイン後にコピー
2)他的本意是将 $_SERVER.REQUEST_URI 进行MD5后返回。
但是在那一段代码里面并么有 将值传入
<code>return $match[1](); </code>
ログイン後にコピー
ログイン後にコピー
文件完整代码
<code> // 判断是否需要静态缓存 static private function requireHtmlCache() { // 分析当前的静态规则 $htmls = C('HTML_CACHE_RULES'); // 读取静态规则 if(!empty($htmls)) { $htmls = array_change_key_case($htmls); // 静态规则文件定义格式 actionName=>array('静态规则','缓存时间','附加规则') // 'read'=>array('{id},{name}',60,'md5') 必须保证静态规则的唯一性 和 可判断性 // 检测静态规则 $controllerName = strtolower(CONTROLLER_NAME); $actionName = strtolower(ACTION_NAME); if(isset($htmls[$controllerName.':'.$actionName])) { $html = $htmls[$controllerName.':'.$actionName]; // 某个控制器的操作的静态规则 }elseif(isset($htmls[$controllerName.':'])){// 某个控制器的静态规则 $html = $htmls[$controllerName.':']; }elseif(isset($htmls[$actionName])){ $html = $htmls[$actionName]; // 所有操作的静态规则 }elseif(isset($htmls['*'])){ $html = $htmls['*']; // 全局静态规则 } if(!empty($html)) { // 解读静态规则 $rule = is_array($html)?$html[0]:$html; // 以$_开头的系统变量 $callback = function($match){ switch($match[1]){ case '_GET': $var = $_GET[$match[2]]; break; case '_POST': $var = $_POST[$match[2]]; break; case '_REQUEST': $var = $_REQUEST[$match[2]]; break; case '_SERVER': $var = $_SERVER[$match[2]]; break; case '_SESSION': $var = $_SESSION[$match[2]]; break; case '_COOKIE': $var = $_COOKIE[$match[2]]; break; } return (count($match) == 4) ? $match[3]($var) : $var; }; $rule = preg_replace_callback('/{\$(_\w+)\.(\w+)(?:\|(\w+))?}/', $callback, $rule); // {ID|FUN} GET变量的简写 $rule = preg_replace_callback('/{(\w+)\|(\w+)}/', function($match){return $match[2]($_GET[$match[1]]);}, $rule); $rule = preg_replace_callback('/{(\w+)}/', function($match){return $_GET[$match[1]];}, $rule); // 特殊系统变量 $rule = str_ireplace( array('{:controller}','{:action}','{:module}'), array(CONTROLLER_NAME,ACTION_NAME,MODULE_NAME), $rule); // {|FUN} 单独使用函数 $rule = preg_replace_callback('/{|(\w+)}/', function($match){return $match[1]();},$rule); $cacheTime = C('HTML_CACHE_TIME',null,60); if(is_array($html)){ if(!empty($html[2])) $rule = $html[2]($rule); // 应用附加函数 $cacheTime = isset($html[1])?$html[1]:$cacheTime; // 缓存有效期 }else{ $cacheTime = $cacheTime; } // 当前缓存文件 define('HTML_FILE_NAME',HTML_PATH . $rule.C('HTML_FILE_SUFFIX',null,'.html')); return $cacheTime; } } // 无需缓存 return false; } </code>
ログイン後にコピー
ログイン後にコピー
回复内容:
使用ThinkPHP3.2.2,阅读到一文件中有一行这样的代码:
<code># 文件 ThinkPHP/Library/Behavior/ReadHtmlCacheBehavior.class.php # 方法 # {|FUN} 单独使用函数 $rule = preg_replace_callback('/{|(\w+)}/', function($match){return $match[1]();},$rule); </code>
ログイン後にコピー
ログイン後にコピー
1)这个里面 /{|(\w+)}/这一段是不是写错了?
花括号 { },分隔符 | 不是正则的吗?但是却运行正常。
$rule 的值示例:
<code>$rule = '{:module}/{:controller}/{:action}/{$_SERVER.REQUEST_URI|md5}'; </code>
ログイン後にコピー
ログイン後にコピー
2)他的本意是将 $_SERVER.REQUEST_URI 进行MD5后返回。
但是在那一段代码里面并么有 将值传入
<code>return $match[1](); </code>
ログイン後にコピー
ログイン後にコピー
文件完整代码
<code> // 判断是否需要静态缓存 static private function requireHtmlCache() { // 分析当前的静态规则 $htmls = C('HTML_CACHE_RULES'); // 读取静态规则 if(!empty($htmls)) { $htmls = array_change_key_case($htmls); // 静态规则文件定义格式 actionName=>array('静态规则','缓存时间','附加规则') // 'read'=>array('{id},{name}',60,'md5') 必须保证静态规则的唯一性 和 可判断性 // 检测静态规则 $controllerName = strtolower(CONTROLLER_NAME); $actionName = strtolower(ACTION_NAME); if(isset($htmls[$controllerName.':'.$actionName])) { $html = $htmls[$controllerName.':'.$actionName]; // 某个控制器的操作的静态规则 }elseif(isset($htmls[$controllerName.':'])){// 某个控制器的静态规则 $html = $htmls[$controllerName.':']; }elseif(isset($htmls[$actionName])){ $html = $htmls[$actionName]; // 所有操作的静态规则 }elseif(isset($htmls['*'])){ $html = $htmls['*']; // 全局静态规则 } if(!empty($html)) { // 解读静态规则 $rule = is_array($html)?$html[0]:$html; // 以$_开头的系统变量 $callback = function($match){ switch($match[1]){ case '_GET': $var = $_GET[$match[2]]; break; case '_POST': $var = $_POST[$match[2]]; break; case '_REQUEST': $var = $_REQUEST[$match[2]]; break; case '_SERVER': $var = $_SERVER[$match[2]]; break; case '_SESSION': $var = $_SESSION[$match[2]]; break; case '_COOKIE': $var = $_COOKIE[$match[2]]; break; } return (count($match) == 4) ? $match[3]($var) : $var; }; $rule = preg_replace_callback('/{\$(_\w+)\.(\w+)(?:\|(\w+))?}/', $callback, $rule); // {ID|FUN} GET变量的简写 $rule = preg_replace_callback('/{(\w+)\|(\w+)}/', function($match){return $match[2]($_GET[$match[1]]);}, $rule); $rule = preg_replace_callback('/{(\w+)}/', function($match){return $_GET[$match[1]];}, $rule); // 特殊系统变量 $rule = str_ireplace( array('{:controller}','{:action}','{:module}'), array(CONTROLLER_NAME,ACTION_NAME,MODULE_NAME), $rule); // {|FUN} 单独使用函数 $rule = preg_replace_callback('/{|(\w+)}/', function($match){return $match[1]();},$rule); $cacheTime = C('HTML_CACHE_TIME',null,60); if(is_array($html)){ if(!empty($html[2])) $rule = $html[2]($rule); // 应用附加函数 $cacheTime = isset($html[1])?$html[1]:$cacheTime; // 缓存有效期 }else{ $cacheTime = $cacheTime; } // 当前缓存文件 define('HTML_FILE_NAME',HTML_PATH . $rule.C('HTML_FILE_SUFFIX',null,'.html')); return $cacheTime; } } // 无需缓存 return false; } </code>
ログイン後にコピー
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

人気の記事
レポ:チームメイトを復活させる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
1週間前
By 尊渡假赌尊渡假赌尊渡假赌
ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
3週間前
By DDD

人気の記事
レポ:チームメイトを復活させる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
1週間前
By 尊渡假赌尊渡假赌尊渡假赌
ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
3週間前
By DDD

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック
Gmailメールのログイン入り口はどこですか?
7302
9


Java チュートリアル
1622
14


CakePHP チュートリアル
1342
46


Laravel チュートリアル
1259
25


PHP チュートリアル
1207
29



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

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