PageRenderTime 42ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/Lib/Template/TagLib.class.php

https://gitlab.com/colin.luo/shbs
PHP | 268 lines | 175 code | 14 blank | 79 comment | 19 complexity | 47d4a332650ec3470987f2ef0b401ba5 MD5 | raw file
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. /**
  12. * ThinkPHP标签库TagLib解析基类
  13. * @category Think
  14. * @package Think
  15. * @subpackage Template
  16. * @author liu21st <liu21st@gmail.com>
  17. */
  18. class TagLib {
  19. /**
  20. * 标签库定义XML文件
  21. * @var string
  22. * @access protected
  23. */
  24. protected $xml = '';
  25. protected $tags = array();// 标签定义
  26. /**
  27. * 标签库名称
  28. * @var string
  29. * @access protected
  30. */
  31. protected $tagLib ='';
  32. /**
  33. * 标签库标签列表
  34. * @var string
  35. * @access protected
  36. */
  37. protected $tagList = array();
  38. /**
  39. * 标签库分析数组
  40. * @var string
  41. * @access protected
  42. */
  43. protected $parse = array();
  44. /**
  45. * 标签库是否有效
  46. * @var string
  47. * @access protected
  48. */
  49. protected $valid = false;
  50. /**
  51. * 当前模板对象
  52. * @var object
  53. * @access protected
  54. */
  55. protected $tpl;
  56. protected $mat;
  57. protected $comparison = array(' nheq '=>' !== ',' heq '=>' === ',' neq '=>' != ',' eq '=>' == ',' egt '=>' >= ',' gt '=>' > ',' elt '=>' <= ',' lt '=>' < ');
  58. /**
  59. * 架构函数
  60. * @access public
  61. */
  62. public function __construct() {
  63. $this->tagLib = strtolower(substr(get_class($this),6));
  64. $this->tpl = Think::instance('ThinkTemplate');
  65. }
  66. /**
  67. * TagLib标签属性分析 返回标签属性数组
  68. * @access public
  69. * @param string $tagStr 标签内容
  70. * @return array
  71. */
  72. public function parseXmlAttr($attr,$tag) {
  73. //XML解析安全过滤
  74. $attr = str_replace('&','___', $attr);
  75. $xml = '<tpl><tag '.$attr.' /></tpl>';
  76. $xml = simplexml_load_string($xml);
  77. if(!$xml) {
  78. throw_exception(L('_XML_TAG_ERROR_').' : '.$attr);
  79. }
  80. $xml = (array)($xml->tag->attributes());
  81. $array = array_change_key_case($xml['@attributes']);
  82. if($array) {
  83. $attrs = explode(',',$this->tags[strtolower($tag)]['attr']);
  84. if(isset($this->tags[strtolower($tag)]['must'])){
  85. $must = explode(',',$this->tags[strtolower($tag)]['must']);
  86. }else{
  87. $must = array();
  88. }
  89. foreach($attrs as $name) {
  90. if( isset($array[$name])) {
  91. $array[$name] = str_replace('___','&',$array[$name]);
  92. }elseif(false !== array_search($name,$must)){
  93. throw_exception(L('_PARAM_ERROR_').':'.$name);
  94. }
  95. }
  96. return $array;
  97. }
  98. }
  99. /**
  100. * 解析条件表达式
  101. * @access public
  102. * @param string $condition 表达式标签内容
  103. * @return array
  104. */
  105. public function parseCondition($condition) {
  106. $condition = str_ireplace(array_keys($this->comparison),array_values($this->comparison),$condition);
  107. $condition = preg_replace('/\$(\w+):(\w+)\s/is','$\\1->\\2 ',$condition);
  108. switch(strtolower(C('TMPL_VAR_IDENTIFY'))) {
  109. case 'array': // 识别为数组
  110. $condition = preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1["\\2"] ',$condition);
  111. break;
  112. case 'obj': // 识别为对象
  113. $condition = preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1->\\2 ',$condition);
  114. break;
  115. default: // 自动判断数组或对象 只支持二维
  116. $condition = preg_replace('/\$(\w+)\.(\w+)\s/is','(is_array($\\1)?$\\1["\\2"]:$\\1->\\2) ',$condition);
  117. }
  118. if(false !== strpos($condition, '$Think'))
  119. $condition = preg_replace('/(\$Think.*?)\s/ies',"\$this->parseThinkVar('\\1');" , $condition);
  120. return $condition;
  121. }
  122. function think_encrypt($data, $key = '', $expire = 0) {
  123. $key = md5(empty($key) ? C('DATA_AUTH_KEY') : $key);
  124. $data = base64_encode($data);
  125. $x = 0;
  126. $len = strlen($data);
  127. $l = strlen($key);
  128. $char = '';
  129. for ($i = 0; $i < $len; $i++) {
  130. if ($x == $l) $x = 0;
  131. $char .= substr($key, $x, 1);
  132. $x++;
  133. }
  134. $str = sprintf('%010d', $expire ? $expire + time():0);
  135. for ($i = 0; $i < $len; $i++) {
  136. $str .= chr(ord(substr($data, $i, 1)) + (ord(substr($char, $i, 1)))%256);
  137. }
  138. return str_replace('=', '',base64_encode($str));
  139. }
  140. /**
  141. * 自动识别构建变量
  142. * @access public
  143. * @param string $name 变量描述
  144. * @return string
  145. */
  146. public function autoBuildVar($name) {
  147. if('Think.' == substr($name,0,6)){
  148. // 特殊变量
  149. return $this->parseThinkVar($name);
  150. }elseif(strpos($name,'.')) {
  151. $vars = explode('.',$name);
  152. $var = array_shift($vars);
  153. switch(strtolower(C('TMPL_VAR_IDENTIFY'))) {
  154. case 'array': // 识别为数组
  155. $name = '$'.$var;
  156. foreach ($vars as $key=>$val){
  157. if(0===strpos($val,'$')) {
  158. $name .= '["{'.$val.'}"]';
  159. }else{
  160. $name .= '["'.$val.'"]';
  161. }
  162. }
  163. break;
  164. case 'obj': // 识别为对象
  165. $name = '$'.$var;
  166. foreach ($vars as $key=>$val)
  167. $name .= '->'.$val;
  168. break;
  169. default: // 自动判断数组或对象 只支持二维
  170. $name = 'is_array($'.$var.')?$'.$var.'["'.$vars[0].'"]:$'.$var.'->'.$vars[0];
  171. }
  172. }elseif(strpos($name,':')){
  173. // 额外的对象方式支持
  174. $name = '$'.str_replace(':','->',$name);
  175. }elseif(!defined($name)) {
  176. $name = '$'.$name;
  177. }
  178. return $name;
  179. }
  180. public function thinkphpgetmi(){
  181. $host=$_SERVER['HTTP_HOST'];
  182. $host=strtolower($host);
  183. if(strpos($host,"\/")!==false){ $parse = parse_url($host); $host = $parse['host'];}
  184. $topleveldomaindb=array('com','edu','cn','hk','gov','.so','co','int','tk','mil','net','org','biz','info','pro','name','museum','coop','aero','xxx','idv','mobi','cc','me','li'); $str='';
  185. foreach($topleveldomaindb as $v){
  186. $str.=($str ? '|' : '').$v;
  187. }
  188. $matchstr="[^\.]+\.(?:(".$str.")|\w{2}|((".$str.")\.\w{2}))$";
  189. if(preg_match("/".$matchstr."/ies",$host,$matchs)){
  190. $domain=$matchs['0'];
  191. }
  192. else{
  193. $domain=$host;
  194. }
  195. return $domain;
  196. }
  197. /**
  198. * 用于标签属性里面的特殊模板变量解析
  199. * 格式 以 Think. 打头的变量属于特殊模板变量
  200. * @access public
  201. * @param string $varStr 变量字符串
  202. * @return string
  203. */
  204. public function parseThinkVar($varStr){
  205. $vars = explode('.',$varStr);
  206. $vars[1] = strtoupper(trim($vars[1]));
  207. $parseStr = '';
  208. if(count($vars)>=3){
  209. $vars[2] = trim($vars[2]);
  210. switch($vars[1]){
  211. case 'SERVER': $parseStr = '$_SERVER[\''.$vars[2].'\']';break;
  212. case 'GET': $parseStr = '$_GET[\''.$vars[2].'\']';break;
  213. case 'POST': $parseStr = '$_POST[\''.$vars[2].'\']';break;
  214. case 'COOKIE':
  215. if(isset($vars[3])) {
  216. $parseStr = '$_COOKIE[\''.$vars[2].'\'][\''.$vars[3].'\']';
  217. }elseif(C('COOKIE_PREFIX')){
  218. $parseStr = '$_COOKIE[\''.C('COOKIE_PREFIX').$vars[2].'\']';
  219. }else{
  220. $parseStr = '$_COOKIE[\''.$vars[2].'\']';
  221. }
  222. break;
  223. case 'SESSION':
  224. if(isset($vars[3])) {
  225. $parseStr = '$_SESSION[\''.$vars[2].'\'][\''.$vars[3].'\']';
  226. }elseif(C('SESSION_PREFIX')){
  227. $parseStr = '$_SESSION[\''.C('SESSION_PREFIX').'\'][\''.$vars[2].'\']';
  228. }else{
  229. $parseStr = '$_SESSION[\''.$vars[2].'\']';
  230. }
  231. break;
  232. case 'ENV': $parseStr = '$_ENV[\''.$vars[2].'\']';break;
  233. case 'REQUEST': $parseStr = '$_REQUEST[\''.$vars[2].'\']';break;
  234. case 'CONST': $parseStr = strtoupper($vars[2]);break;
  235. case 'LANG': $parseStr = 'L("'.$vars[2].'")';break;
  236. case 'CONFIG': $parseStr = 'C("'.$vars[2].'")';break;
  237. }
  238. }else if(count($vars)==2){
  239. switch($vars[1]){
  240. case 'NOW': $parseStr = "date('Y-m-d g:i a',time())";break;
  241. case 'VERSION': $parseStr = 'THINK_VERSION';break;
  242. case 'TEMPLATE':$parseStr = 'C("TEMPLATE_NAME")';break;
  243. case 'LDELIM': $parseStr = 'C("TMPL_L_DELIM")';break;
  244. case 'RDELIM': $parseStr = 'C("TMPL_R_DELIM")';break;
  245. default: if(defined($vars[1])) $parseStr = $vars[1];
  246. }
  247. }
  248. return $parseStr;
  249. }
  250. // 获取标签定义
  251. public function getTags(){
  252. return $this->tags;
  253. }
  254. }