mod 有点小问题,第103行
见下面代码
array(),
'volist' => array('attr'=>'name,id,offset,length,key,mod','level'=>3,'alias'=>'iterate'),
'foreach' => array('attr'=>'name,item,key','level'=>3),
'if' => array('attr'=>'condition','level'=>2),
'elseif' => array('attr'=>'condition','close'=>0),
'else' => array('attr'=>'','close'=>0),
'switch' => array('attr'=>'name','level'=>2),
'case' => array('attr'=>'value,break'),
'default' => array('attr'=>'','close'=>0),
'compare' => array('attr'=>'name,value,type','level'=>3,'alias'=>'eq,equal,notequal,neq,gt,lt,egt,elt,heq,nheq'),
'range' => array('attr'=>'name,value,type','level'=>3,'alias'=>'in,notin,between,notbetween'),
'empty' => array('attr'=>'name','level'=>3),
'notempty' => array('attr'=>'name','level'=>3),
'present' => array('attr'=>'name','level'=>3),
'notpresent'=> array('attr'=>'name','level'=>3),
'defined' => array('attr'=>'name','level'=>3),
'notdefined'=> array('attr'=>'name','level'=>3),
'import' => array('attr'=>'file,href,type,value,basepath','close'=>0,'alias'=>'load,css,js'),
'assign' => array('attr'=>'name,value','close'=>0),
'define' => array('attr'=>'name,value','close'=>0),
'for' => array('attr'=>'start,end,name,comparison,step', 'level'=>3),
);
/**
* php标签解析
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _php($attr,$content) {
$parsestr = '';
return $parsestr;
}
/**
* volist标签解析 循环输出数据集
* 格式:
*
* {user.username}
* {user.email}
*
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string|void
*/
public function _volist($attr,$content) {
static $_iterateparsecache = array();
//如果已经解析过,则直接返回变量值
$cacheiterateid = md5($attr.$content);
if(isset($_iterateparsecache[$cacheiterateid]))
return $_iterateparsecache[$cacheiterateid];
$tag = $this->parsexmlattr($attr,'volist');
$name = $tag['name'];
$id = $tag['id'];
$empty = isset($tag['empty'])?$tag['empty']:'';
$key = !empty($tag['key'])?$tag['key']:'i';
$mod = isset($tag['mod'])?$tag['mod']:'2';
// 允许使用函数设定数据集 {$vo.name}
$parsestr = 'autobuildvar($name);
}
$parsestr .= 'if(is_array('.$name.')): $'.$key.' = 0;';
if(isset($tag['length']) && '' !=$tag['length'] ) {
$parsestr .= ' $__list__ = array_slice('.$name.','.$tag['offset'].','.$tag['length'].',true);';
}elseif(isset($tag['offset']) && '' !=$tag['offset']){
$parsestr .= ' $__list__ = array_slice('.$name.','.$tag['offset'].',null,true);';
}else{
$parsestr .= ' $__list__ = '.$name.';';
}
$parsestr .= 'if( count($__list__)==0 ) : echo '.$empty.' ;';
$parsestr .= 'else: ';
$parsestr .= 'foreach($__list__ as $key=>$'.$id.'): ';
//改善后
$parsestr .= '++$'.$key.';';
$parsestr .= '$mod = ($'.$key.' % '.$mod.' );';
$parsestr .= '?>';
/*改善前
$parsestr .= '$mod = ($'.$key.' % '.$mod.' );';
$parsestr .= '++$'.$key.';?>';*/
$parsestr .= $this->tpl->parse($content);
$parsestr .= '';
$_iterateparsecache[$cacheiterateid] = $parsestr;
if(!empty($parsestr)) {
return $parsestr;
}
return ;
}
/**
* foreach标签解析 循环输出数据集
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string|void
*/
public function _foreach($attr,$content) {
static $_iterateparsecache = array();
//如果已经解析过,则直接返回变量值
$cacheiterateid = md5($attr.$content);
if(isset($_iterateparsecache[$cacheiterateid]))
return $_iterateparsecache[$cacheiterateid];
$tag = $this->parsexmlattr($attr,'foreach');
$name = $tag['name'];
$item = $tag['item'];
$key = !empty($tag['key'])?$tag['key']:'key';
$name = $this->autobuildvar($name);
$parsestr = '$'.$item.'): ?>';
$parsestr .= $this->tpl->parse($content);
$parsestr .= '';
$_iterateparsecache[$cacheiterateid] = $parsestr;
if(!empty($parsestr)) {
return $parsestr;
}
return ;
}
/**
* if标签解析
* 格式:
*
*
*
*
* 表达式支持 eq neq gt egt lt elt == > >= * @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _if($attr,$content) {
$tag = $this->parsexmlattr($attr,'if');
$condition = $this->parsecondition($tag['condition']);
$parsestr = ''.$content.'';
return $parsestr;
}
/**
* else标签解析
* 格式:见if标签
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _elseif($attr,$content) {
$tag = $this->parsexmlattr($attr,'elseif');
$condition = $this->parsecondition($tag['condition']);
$parsestr = '';
return $parsestr;
}
/**
* else标签解析
* @access public
* @param string $attr 标签属性
* @return string
*/
public function _else($attr) {
$parsestr = '';
return $parsestr;
}
/**
* switch标签解析
* 格式:
*
* 1
* 2
* other
*
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _switch($attr,$content) {
$tag = $this->parsexmlattr($attr,'switch');
$name = $tag['name'];
$vararray = explode('|',$name);
$name = array_shift($vararray);
$name = $this->autobuildvar($name);
if(count($vararray)>0)
$name = $this->tpl->parsevarfunction($name,$vararray);
$parsestr = ''.$content.'';
return $parsestr;
}
/**
* case标签解析 需要配合switch才有效
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _case($attr,$content) {
$tag = $this->parsexmlattr($attr,'case');
$value = $tag['value'];
if('$' == substr($value,0,1)) {
$vararray = explode('|',$value);
$value = array_shift($vararray);
$value = $this->autobuildvar(substr($value,1));
if(count($vararray)>0)
$value = $this->tpl->parsevarfunction($value,$vararray);
$value = 'case '.$value.': ';
}elseif(strpos($value,'|')){
$values = explode('|',$value);
$value = '';
foreach ($values as $val){
$value .= 'case '.addslashes($val).': ';
}
}else{
$value = 'case '.$value.': ';
}
$parsestr = ''.$content;
$isbreak = isset($tag['break']) ? $tag['break'] : '';
if('' ==$isbreak || $isbreak) {
$parsestr .= '';
}
return $parsestr;
}
/**
* default标签解析 需要配合switch才有效
* 使用: ddfdf
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _default($attr) {
$parsestr = '';
return $parsestr;
}
/**
* compare标签解析
* 用于值的比较 支持 eq neq gt lt egt elt heq nheq 默认是eq
* 格式: content
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _compare($attr,$content,$type='eq') {
$tag = $this->parsexmlattr($attr,'compare');
$name = $tag['name'];
$value = $tag['value'];
$type = isset($tag['type'])?$tag['type']:$type;
$type = $this->parsecondition(' '.$type.' ');
$vararray = explode('|',$name);
$name = array_shift($vararray);
$name = $this->autobuildvar($name);
if(count($vararray)>0)
$name = $this->tpl->parsevarfunction($name,$vararray);
if('$' == substr($value,0,1)) {
$value = $this->autobuildvar(substr($value,1));
}else {
$value = ''.$value.'';
}
$parsestr = ''.$content.'';
return $parsestr;
}
public function _eq($attr,$content) {
return $this->_compare($attr,$content,'eq');
}
public function _equal($attr,$content) {
return $this->_compare($attr,$content,'eq');
}
public function _neq($attr,$content) {
return $this->_compare($attr,$content,'neq');
}
public function _notequal($attr,$content) {
return $this->_compare($attr,$content,'neq');
}
public function _gt($attr,$content) {
return $this->_compare($attr,$content,'gt');
}
public function _lt($attr,$content) {
return $this->_compare($attr,$content,'lt');
}
public function _egt($attr,$content) {
return $this->_compare($attr,$content,'egt');
}
public function _elt($attr,$content) {
return $this->_compare($attr,$content,'elt');
}
public function _heq($attr,$content) {
return $this->_compare($attr,$content,'heq');
}
public function _nheq($attr,$content) {
return $this->_compare($attr,$content,'nheq');
}
/**
* range标签解析
* 如果某个变量存在于某个范围 则输出内容 type= in 表示在范围内 否则表示在范围外
* 格式: content
* example: content
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @param string $type 比较类型
* @return string
*/
public function _range($attr,$content,$type='in') {
$tag = $this->parsexmlattr($attr,'range');
$name = $tag['name'];
$value = $tag['value'];
$vararray = explode('|',$name);
$name = array_shift($vararray);
$name = $this->autobuildvar($name);
if(count($vararray)>0)
$name = $this->tpl->parsevarfunction($name,$vararray);
$type = isset($tag['type'])?$tag['type']:$type;
if('$' == substr($value,0,1)) {
$value = $this->autobuildvar(substr($value,1));
$str = 'is_array('.$value.')?'.$value.':explode(\',\','.$value.')';
}else{
$value = ''.$value.'';
$str = 'explode(\',\','.$value.')';
}
if($type=='between') {
$parsestr = '= $_range_var_[0] && '.$name.''.$content.'';
}elseif($type=='notbetween'){
$parsestr = ''.$content.'';
}else{
$fun = ($type == 'in')? 'in_array' : '!in_array';
$parsestr = ''.$content.'';
}
return $parsestr;
}
// range标签的别名 用于in判断
public function _in($attr,$content) {
return $this->_range($attr,$content,'in');
}
// range标签的别名 用于notin判断
public function _notin($attr,$content) {
return $this->_range($attr,$content,'notin');
}
public function _between($attr,$content){
return $this->_range($attr,$content,'between');
}
public function _notbetween($attr,$content){
return $this->_range($attr,$content,'notbetween');
}
/**
* present标签解析
* 如果某个变量已经设置 则输出内容
* 格式: content
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _present($attr,$content) {
$tag = $this->parsexmlattr($attr,'present');
$name = $tag['name'];
$name = $this->autobuildvar($name);
$parsestr = ''.$content.'';
return $parsestr;
}
/**
* notpresent标签解析
* 如果某个变量没有设置,则输出内容
* 格式: content
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _notpresent($attr,$content) {
$tag = $this->parsexmlattr($attr,'notpresent');
$name = $tag['name'];
$name = $this->autobuildvar($name);
$parsestr = ''.$content.'';
return $parsestr;
}
/**
* empty标签解析
* 如果某个变量为empty 则输出内容
* 格式: content
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _empty($attr,$content) {
$tag = $this->parsexmlattr($attr,'empty');
$name = $tag['name'];
$name = $this->autobuildvar($name);
$parsestr = ''.$content.'';
return $parsestr;
}
public function _notempty($attr,$content) {
$tag = $this->parsexmlattr($attr,'notempty');
$name = $tag['name'];
$name = $this->autobuildvar($name);
$parsestr = ''.$content.'';
return $parsestr;
}
/**
* 判断是否已经定义了该常量
* 已定义
* @param $attr
* @param $content
* @return string
*/
public function _defined($attr,$content) {
$tag = $this->parsexmlattr($attr,'defined');
$name = $tag['name'];
$parsestr = ''.$content.'';
return $parsestr;
}
public function _notdefined($attr,$content) {
$tag = $this->parsexmlattr($attr,'_notdefined');
$name = $tag['name'];
$parsestr = ''.$content.'';
return $parsestr;
}
/**
* import 标签解析
*
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @param boolean $isfile 是否文件方式
* @param string $type 类型
* @return string
*/
public function _import($attr,$content,$isfile=false,$type='') {
$tag = $this->parsexmlattr($attr,'import');
$file = isset($tag['file'])?$tag['file']:$tag['href'];
$parsestr = '';
$endstr = '';
// 判断是否存在加载条件 允许使用函数判断(默认为isset)
if (isset($tag['value'])) {
$vararray = explode('|',$tag['value']);
$name = array_shift($vararray);
$name = $this->autobuildvar($name);
if (!empty($vararray))
$name = $this->tpl->parsevarfunction($name,$vararray);
else
$name = 'isset('.$name.')';
$parsestr .= '';
$endstr = '';
}
if($isfile) {
// 根据文件名后缀自动识别
$type = $type?$type:(!empty($tag['type'])?strtolower($tag['type']):null);
// 文件方式导入
$array = explode(',',$file);
foreach ($array as $val){
if (!$type || isset($reset)) {
$type = $reset = strtolower(substr(strrchr($val, '.'),1));
}
switch($type) {
case 'js':
$parsestr .= '';
break;
case 'css':
$parsestr .= '';
break;
case 'php':
$parsestr .= '';
break;
}
}
}else{
// 命名空间导入模式 默认是js
$type = $type?$type:(!empty($tag['type'])?strtolower($tag['type']):'js');
$basepath = !empty($tag['basepath'])?$tag['basepath']:__root__.'/public';
// 命名空间方式导入外部文件
$array = explode(',',$file);
foreach ($array as $val){
list($val,$version) = explode('?',$val);
switch($type) {
case 'js':
$parsestr .= '';
break;
case 'css':
$parsestr .= '';
break;
case 'php':
$parsestr .= '';
break;
}
}
}
return $parsestr.$endstr;
}
// import别名 采用文件方式加载(要使用命名空间必须用import) 例如
public function _load($attr,$content) {
return $this->_import($attr,$content,true);
}
// import别名使用 导入css文件
public function _css($attr,$content) {
return $this->_import($attr,$content,true,'css');
}
// import别名使用 导入js文件
public function _js($attr,$content) {
return $this->_import($attr,$content,true,'js');
}
/**
* assign标签解析
* 在模板中给某个变量赋值 支持变量赋值
* 格式:
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _assign($attr,$content) {
$tag = $this->parsexmlattr($attr,'assign');
$name = $this->autobuildvar($tag['name']);
if('$'==substr($tag['value'],0,1)) {
$value = $this->autobuildvar(substr($tag['value'],1));
}else{
$value = '\''.$tag['value']. '\'';
}
$parsestr = '';
return $parsestr;
}
/**
* define标签解析
* 在模板中定义常量 支持变量赋值
* 格式:
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _define($attr,$content) {
$tag = $this->parsexmlattr($attr,'define');
$name = '\''.$tag['name']. '\'';
if('$'==substr($tag['value'],0,1)) {
$value = $this->autobuildvar(substr($tag['value'],1));
}else{
$value = '\''.$tag['value']. '\'';
}
$parsestr = '';
return $parsestr;
}
/**
* for标签解析
* 格式:
* @access public
* @param string $attr 标签属性
* @param string $content 标签内容
* @return string
*/
public function _for($attr, $content){
//设置默认值
$start = 0;
$end = 0;
$step = 1;
$comparison = 'lt';
$name = 'i';
$rand = rand(); //添加随机数,防止嵌套变量冲突
//获取属性
foreach ($this->parsexmlattr($attr, 'for') as $key => $value){
$value = trim($value);
if(':'==substr($value,0,1))
$value = substr($value,1);
elseif('$'==substr($value,0,1))
$value = $this->autobuildvar(substr($value,1));
switch ($key){
case 'start':
$start = $value; break;
case 'end' :
$end = $value; break;
case 'step':
$step = $value; break;
case 'comparison':
$comparison = $value; break;
case 'name':
$name = $value; break;
}
}
$parsestr = 'parsecondition('$'.$name.' '.$comparison.' $__for_end_'.$rand.'__').';$'.$name.'+='.$step.'){ ?>';
$parsestr .= $content;
$parsestr .= '';
return $parsestr;
}
}
ad:真正免费,域名+虚机+企业邮箱=0元