BVB Source Codes

The latest thinkphp v5.2 work order system Show TagLib.class.php Source code

Return Download The latest thinkphp v5.2 work order system: download TagLib.class.php Source code - Download The latest thinkphp v5.2 work order system Source code - Type:.php
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2014 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. namespace Think\Template;
  12. /**
  13.  * ThinkPHP标签库TagLib解析基类
  14.  */
  15. class TagLib {
  16.  
  17.     /**
  18.      * 标签库定义XML文件
  19.      * @var string
  20.      * @access protected
  21.      */
  22.     protected $xml      = '';
  23.     protected $tags     = array();// 标签定义
  24.     /**
  25.      * 标签库名称
  26.      * @var string
  27.      * @access protected
  28.      */
  29.     protected $tagLib   ='';
  30.  
  31.     /**
  32.      * 标签库标签列表
  33.      * @var string
  34.      * @access protected
  35.      */
  36.     protected $tagList  = array();
  37.  
  38.     /**
  39.      * 标签库分析数组
  40.      * @var string
  41.      * @access protected
  42.      */
  43.     protected $parse    = array();
  44.  
  45.     /**
  46.      * 标签库是否有效
  47.      * @var string
  48.      * @access protected
  49.      */
  50.     protected $valid    = false;
  51.  
  52.     /**
  53.      * 当前模板对象
  54.      * @var object
  55.      * @access protected
  56.      */
  57.     protected $tpl;
  58.  
  59.     protected $comparison = array(' nheq '=>' !== ',' heq '=>' === ',' neq '=>' != ',' eq '=>' == ',' egt '=>' >= ',' gt '=>' > ',' elt '=>' <= ',' lt '=>' < ');
  60.  
  61.     /**
  62.      * 架构函数
  63.      * @access public
  64.      */
  65.     public function __construct() {
  66.         $this->tagLib  = strtolower(substr(get_class($this),6));
  67.         $this->tpl     = \Think\Think::instance('Think\\Template');
  68.     }
  69.  
  70.     /**
  71.      * TagLib标签属性分析 返回标签属性数组
  72.      * @access public
  73.      * @param string $tagStr 标签内容
  74.      * @return array
  75.      */
  76.     public function parseXmlAttr($attr,$tag) {
  77.         //XML解析安全过滤
  78.         $attr   =   str_replace('&','___', $attr);
  79.         $xml    =   '<tpl><tag '.$attr.' /></tpl>';
  80.         $xml    =   simplexml_load_string($xml);
  81.         if(!$xml) {
  82.             E(L('_XML_TAG_ERROR_').' : '.$attr);
  83.         }
  84.         $xml    =   (array)($xml->tag->attributes());
  85.         if(isset($xml['@attributes'])){
  86.             $array  =   array_change_key_case($xml['@attributes']);
  87.             if($array) {
  88.                 $tag    =   strtolower($tag);
  89.                 if(!isset($this->tags[$tag])){
  90.                     // 检测是否存在别名定义
  91.                     foreach($this->tags as $key=>$val){
  92.                         if(isset($val['alias']) && in_array($tag,explode(',',$val['alias']))){
  93.                             $item  =   $val;
  94.                             break;
  95.                         }
  96.                     }
  97.                 }else{
  98.                     $item  =   $this->tags[$tag];
  99.                 }            
  100.                 $attrs  = explode(',',$item['attr']);
  101.                 if(isset($item['must'])){
  102.                     $must   =   explode(',',$item['must']);
  103.                 }else{
  104.                     $must   =   array();
  105.                 }
  106.                 foreach($attrs as $name) {
  107.                     if( isset($array[$name])) {
  108.                         $array[$name] = str_replace('___','&',$array[$name]);
  109.                     }elseif(false !== array_search($name,$must)){
  110.                         E(L('_PARAM_ERROR_').':'.$name);
  111.                     }
  112.                 }
  113.                 return $array;
  114.             }
  115.         }else{
  116.             return array();
  117.         }
  118.     }
  119.  
  120.     /**
  121.      * 解析条件表达式
  122.      * @access public
  123.      * @param string $condition 表达式标签内容
  124.      * @return array
  125.      */
  126.     public function parseCondition($condition) {
  127.         $condition = str_ireplace(array_keys($this->comparison),array_values($this->comparison),$condition);
  128.         $condition = preg_replace('/\$(\w+):(\w+)\s/is','$\\1->\\2 ',$condition);
  129.         switch(strtolower(C('TMPL_VAR_IDENTIFY'))) {
  130.             case 'array': // 识别为数组
  131.                 $condition  =   preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1["\\2"] ',$condition);
  132.                 break;
  133.             case 'obj':  // 识别为对象
  134.                 $condition  =   preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1->\\2 ',$condition);
  135.                 break;
  136.             default:  // 自动判断数组或对象 只支持二维
  137.                 $condition  =   preg_replace('/\$(\w+)\.(\w+)\s/is','(is_array($\\1)?$\\1["\\2"]:$\\1->\\2) ',$condition);
  138.         }
  139.         if(false !== strpos($condition, '$Think'))
  140.             $condition      =   preg_replace_callback('/(\$Think.*?)\s/is', array($this, 'parseThinkVar'), $condition);        
  141.         return $condition;
  142.     }
  143.  
  144.     /**
  145.      * 自动识别构建变量
  146.      * @access public
  147.      * @param string $name 变量描述
  148.      * @return string
  149.      */
  150.     public function autoBuildVar($name) {
  151.         if('Think.' == substr($name,0,6)){
  152.             // 特殊变量
  153.             return $this->parseThinkVar($name);
  154.         }elseif(strpos($name,'.')) {
  155.             $vars = explode('.',$name);
  156.             $var  =  array_shift($vars);
  157.             switch(strtolower(C('TMPL_VAR_IDENTIFY'))) {
  158.                 case 'array': // 识别为数组
  159.                     $name = '$'.$var;
  160.                     foreach ($vars as $key=>$val){
  161.                         if(0===strpos($val,'$')) {
  162.                             $name .= '["{'.$val.'}"]';
  163.                         }else{
  164.                             $name .= '["'.$val.'"]';
  165.                         }
  166.                     }
  167.                     break;
  168.                 case 'obj':  // 识别为对象
  169.                     $name = '$'.$var;
  170.                     foreach ($vars as $key=>$val)
  171.                         $name .= '->'.$val;
  172.                     break;
  173.                 default:  // 自动判断数组或对象 只支持二维
  174.                     $name = 'is_array($'.$var.')?$'.$var.'["'.$vars[0].'"]:$'.$var.'->'.$vars[0];
  175.             }
  176.         }elseif(strpos($name,':')){
  177.             // 额外的对象方式支持
  178.             $name   =   '$'.str_replace(':','->',$name);
  179.         }elseif(!defined($name)) {
  180.             $name = '$'.$name;
  181.         }
  182.         return $name;
  183.     }
  184.  
  185.     /**
  186.      * 用于标签属性里面的特殊模板变量解析
  187.      * 格式 以 Think. 打头的变量属于特殊模板变量
  188.      * @access public
  189.      * @param string $varStr  变量字符串
  190.      * @return string
  191.      */
  192.     public function parseThinkVar($varStr){
  193.         if(is_array($varStr)){//用于正则替换回调函数
  194.             $varStr = $varStr[1];
  195.         }
  196.         $vars       = explode('.',$varStr);
  197.         $vars[1]    = strtoupper(trim($vars[1]));
  198.         $parseStr   = '';
  199.         if(count($vars)>=3){
  200.             $vars[2] = trim($vars[2]);
  201.             switch($vars[1]){
  202.                 case 'SERVER':    $parseStr = '$_SERVER[\''.$vars[2].'\']';break;
  203.                 case 'GET':         $parseStr = '$_GET[\''.$vars[2].'\']';break;
  204.                 case 'POST':       $parseStr = '$_POST[\''.$vars[2].'\']';break;
  205.                 case 'COOKIE':
  206.                     if(isset($vars[3])) {
  207.                         $parseStr = '$_COOKIE[\''.$vars[2].'\'][\''.$vars[3].'\']';
  208.                     }elseif(C('COOKIE_PREFIX')){
  209.                         $parseStr = '$_COOKIE[\''.C('COOKIE_PREFIX').$vars[2].'\']';
  210.                     }else{
  211.                         $parseStr = '$_COOKIE[\''.$vars[2].'\']';
  212.                     }
  213.                     break;
  214.                 case 'SESSION':
  215.                     if(isset($vars[3])) {
  216.                         $parseStr = '$_SESSION[\''.$vars[2].'\'][\''.$vars[3].'\']';
  217.                     }elseif(C('SESSION_PREFIX')){
  218.                         $parseStr = '$_SESSION[\''.C('SESSION_PREFIX').'\'][\''.$vars[2].'\']';
  219.                     }else{
  220.                         $parseStr = '$_SESSION[\''.$vars[2].'\']';
  221.                     }
  222.                     break;
  223.                 case 'ENV':         $parseStr = '$_ENV[\''.$vars[2].'\']';break;
  224.                 case 'REQUEST':  $parseStr = '$_REQUEST[\''.$vars[2].'\']';break;
  225.                 case 'CONST':     $parseStr = strtoupper($vars[2]);break;
  226.                 case 'LANG':       $parseStr = 'L("'.$vars[2].'")';break;
  227.                 case 'CONFIG':    $parseStr = 'C("'.$vars[2].'")';break;
  228.             }
  229.         }else if(count($vars)==2){
  230.             switch($vars[1]){
  231.                 case 'NOW':       $parseStr = "date('Y-m-d g:i a',time())";break;
  232.                 case 'VERSION':  $parseStr = 'THINK_VERSION';break;
  233.                 case 'TEMPLATE':$parseStr = 'C("TEMPLATE_NAME")';break;
  234.                 case 'LDELIM':    $parseStr = 'C("TMPL_L_DELIM")';break;
  235.                 case 'RDELIM':    $parseStr = 'C("TMPL_R_DELIM")';break;
  236.                 default:  if(defined($vars[1])) $parseStr = $vars[1];
  237.             }
  238.         }
  239.         return $parseStr;
  240.     }
  241.  
  242.     // 获取标签定义
  243.     public function getTags(){
  244.         return $this->tags;
  245.     }
  246. }
downloadTagLib.class.php Source code - Download The latest thinkphp v5.2 work order system Source code
Related Source Codes/Software:
V3.3.6 Workerman high-performance PHP Socket (framework) - High performance PHP Socket framework Workerman re... 2017-05-03
The phosphor meeting room reservation system MRBS (loop reservation v16.0) - The phosphor meeting room reservation system MRBS ... 2017-05-03
IDC v5.2.3 agent center - IDC Centre IDC for exploitation is a PHP+MySQL age... 2017-05-03
Zen master v9.0.1 project management software - Zen is the first domestic open source project mana... 2017-05-03
Ray speed v7.03 employee files management system - Employee files project is various, and some conten... 2017-05-03
HITCMS Haitian responsive electronic mechanical v3.0 foreign trade website source code - HITCMS Haitian response electronic machinery trade... 2017-05-03
Ray v7.02 speed survey system - Lightning speed survey system is a. NET+MSSQL deve... 2017-05-03
Cool HITCMS reactive black v3.0 enterprise website source code - HITCMS-Haitian response black enterprises website ... 2017-05-03
WebOA v17.2 network office automation system - WebOA network using b/s structure development of o... 2017-05-03
Pure imitation of han site source code, one a 】 【 c9cms kernel v1.0 - Generic http://www.wufazhuce.com/Han one · Config... 2017-05-04
zone.js - Implements Zones for JavaScript ... 2017-05-11
dragonfly - A Ruby gem for on-the-fly processing - suitable fo... 2017-05-11
oh-my-fish - The Fishshell Framework. 2017-05-11
canvas-lms - The open LMS by Instructure, Inc. 2017-05-11
ledger - Double-entry accounting system with a command-line... 2017-05-11
Python - My Python Examples http://w... 2017-05-11
blade - 2017-05-11
LaZagne - Credentials recovery project 2017-05-10
Pull-to-Refresh.Rentals-iOS - This project aims to provide a simple and customiz... 2017-05-10
spoon - Distributing instrumentation tests to all your And... 2017-05-10

 Back to top