当前位置:文档之家› php-自定义标签解析

php-自定义标签解析

php-自定义标签解析
php-自定义标签解析

php自己定义解析方式(比较简单的写法)

格式:

{sxq:blist num="10" Intercept="10" order="desc"}

{loop $data $r}

  • {$r[title]}
  • {$r[content]}
  • {$r[zut]}
  • {/loop}

    {/sxq:blist}

    ------------------------------------------------------------------------------

    以{sxq: }开始

    以{/sxq:}结束

    冒号紧跟的是传入的数据需要获取的方式

    以英文空格分开后面的参数

    第二行的{loop}目前里面的参数么有用到,但是不需填写,只要出现loop就行

    需要循环的html里面的参数目前是写死的,

    必需$r开始取值,

    如果需要用到key直接用$k 取,

    这个可以根据自己的需要变化,

    Php部分—

    defined('BASEPATH') OR exit('No direct script access allowed');

    class Template

    {

    //属性

    public $vars; //保存要替换的标记和数据的内容

    public $left_delimiter = '{*'; //左分隔符

    public $right_delimiter = '*}'; //右分隔符

    /**

    *@@desc:获取全部htmL

    *@date:201612221010

    *@ html_str html内容

    */

    private function html_content_pe($html_str){

    $regex2 = "/{(sxq:[a-z].*?)}(.*?){(\/sxq:[a-z].*?)}/si";

    if(preg_match_all($regex2, $html_str, $matchest)){

    $row_str= $this->Label_html($html_str);

    $string = count($matchest['0']) >1?$this->explodeRole($row_str,$html_str):$this->explodeRole_one($row _str,$html_str);

    }

    return $string?$string:'';

    /**

    *@@desc:返回传入的参数

    *@date:20161221

    *@func 匹配模块功能函数

    *@farr 匹配模块功能参数

    *@html 匹配模块标签

    *@data_key html标签

    */

    public function pbs_interface($func, $farr='', $html='', $data_key=''){ $fun_t = 'Tag'.$func;

    $fun_f = 'tagf'.$func;

    $r_name = $fun_t.'.php';

    require_once($r_name);

    $obj = $fun_t::getObj();

    $this->cf_existsyn($fun_t,$obj,$fun_f);

    return $obj->$fun_f($farr, $html, $data_key);

    }

    /**

    *@获取布局范围zhi

    *@date:201612220909

    */

    private function explodeRole($row_str,$str) {

    foreach($row_str as $rkey => $rval) {

    $fil_a = $rval['0'];

    $fil_b = $rval['1'];

    $str = str_replace($fil_a, $fil_b, $str);

    }

    return $str;

    }

    /**

    *@@desc:获取布局范围

    *@date:201612220909

    */

    private function explodeRole_one($row_str, $html_str){

    $fil_a = $row_str['0'];

    $fil_b = $row_str['1'];

    return str_replace($fil_a, $fil_b, $html_str);

    /**

    *@获取布局范围

    *@date:20161220

    */

    private function Label_html($str2){

    $regex2 = "/{(sxq:[a-z].*?)}(.*?){(\/sxq:[a-z].*?)}/si";

    if(preg_match_all($regex2, $str2, $matchest)){

    $arr_str = count($matchest['0']) > 1?$this->pbs_zhfunc_row($matchest):$this->pbs_zhfunc_one($matchest);

    return $arr_str;

    }

    }

    /**

    *@desc:获取标签内容

    *@date:20161221

    *@$hui_fun 回调函数定义

    *@label_b_arr_config 配置参数

    */

    private function Parser($Label_a,$Label_b,$Label_c,$Label_d){

    $fun_name = explode(':',$Label_d);

    $label_b_arr = explode(' ',$Label_b);

    $label_b_arr_config['func'] = $fun_name['1'];

    $label_b_arr_config['farr'] = $this->pb_configure($label_b_arr);

    return $this->Parser_c($label_b_arr_config,$Label_c);

    }

    /**

    *@获取内部结构

    */

    private function Parser_c($label_b_arr_config, $Label_c){

    $label_b_arr_config['html'] = $Label_c;

    $label_b_arr_config['data_key'] = $this->pbs_loops_hstr($Label_c);

    return call_user_func_array(array($this, 'pbs_interface'),$label_b_arr_config);

    }

    /**

    *@desc:处理位置

    *@date:201612221017

    * Label_a 读取整体结构

    * Label_b 读取整体结构xcar:tlist row="10" order="desc"

    * Label_c 内部整体结构

    * Label_d 结尾部分

    */

    private function pbs_zhfunc_one($matchest){

    $Label_a = $matchest['0']['0'];

    $Label_b = $matchest['1']['0'];

    $Label_c = $matchest['2']['0'];

    $Label_d = $matchest['3']['0'];

    $arr_srow = $this->Parser($Label_a,$Label_b,$Label_c,$Label_d);

    return array($Label_a,$arr_srow);

    }

    /**

    *@desc:获取内部结构

    *@date:2016122210447

    *@for_arrp 循环的参数

    *@f_arr 循环的数组名称loop

    *@f_arr_data 循环的数组名称$data

    *@f_arr_key 循环的数组名称val

    *@for_arr_html 循环的html 标签

    * 没有处理有key存在的情况

    */

    private function pbs_loops_hstr($Label_c){

    $regex_loop = "/{(loop.*?)}(.*?){(\/loop.*?)}/si";

    if(preg_match_all($regex_loop, $Label_c, $Label_c_arr)){

    $for_arrp = explode(' ',$Label_c_arr['1']['0']);

    $f_arr = $for_arrp['0'];

    $f_arr_data = $for_arrp['1'];

    $f_arr_key = $for_arrp['2'];

    $for_arr_html = $Label_c_arr['2']['0'];

    $Label_c_arr_qbej = array('loop'=>$f_arr,'data'=>$f_arr_data,'key'=>$f_arr_key,'html'=>$for_arr_html);

    }

    return $Label_c_arr_qbej?$Label_c_arr_qbej:'';

    }

    /**

    *@desc:处理位置

    *@date:201612221017

    * Label_a 读取整体结构

    * Label_b 读取整体结构xcar:tlist row="10" order="desc"

    * Label_c 内部整体结构

    * Label_d 结尾部分

    */

    private function pbs_zhfunc_row($matchest){

    for($i=0;$i < count($matchest['0']);$i++){

    $Label_a = $matchest['0'][$i];

    $Label_b = $matchest['1'][$i];

    $Label_c = $matchest['2'][$i];

    $Label_d = $matchest['3'][$i];

    $arr_srow = $this->Parser($Label_a,$Label_b,$Label_c,$Label_d);

    $arr_str[$i] = array($Label_a,$arr_srow);

    }

    return $arr_str;

    }

    /**

    *@desc:处理返回的参数

    *@date:20161221

    */

    private function pb_configure($str){

    $strc ='';

    foreach($str as $skey => $sval){

    $sval_arr = explode('=',$sval);

    if($skey >0){

    $strc[$sval_arr['0']] = str_replace('"','',$sval_arr[1]);

    }

    }

    return $strc;

    }

    private function cf_existsyn($clss,$obj,$fun_f){

    if(!class_exists($clss)){

    die('ERROR::传入类不存在');

    }

    if(!method_exists($obj,$fun_f)){

    die('ERROR::传入函数不存在');

    }

    }

    }

    ?>

    自定义样式(style)与主题(theme)

    Android提供了许多可视的组件。通过自定义样式和主题,可以避免用这些组件开发的应用看上去千篇一律。 样式和主题都是通过预定义一系列属性值来形成统一的显示风格。区别是,样式只能应用于某种类型的View;而主题刚好相反,它不能应用于特定的View,而只能作用于一个或多个Activity,或是整个应用。 以下结合具体例子说明如何定义样式和主题: 1.定义样式和主题 在工程中res/values/下添加styles.xml 1. 2. 3. 4. 8. 9. 10. 16. 17. 18.