封装php类批量解析css成json格式

封装php类批量解析css成json格式


业务需求

我相信不少同窗有过作一个自定义建站系统的想法,比如某空间的自定义拖拽组件,若是想要实现一个可视化建站系统,那CSS做为前端样式而言,是必需要存入到数据库中做为配置项的,因此,这里不可避免的须要对css作解析,我这里给出个人解析方法,固然还有很大的优化空间,这只是一个第一版,实现了最原始的解析过程,但愿你们拍砖。

实现方法

  • 话很少说,先上代码,我们先睹为快。

    /**
  • Css解析成json类
  • Author:dreamzk
  • Data: 2015.05.21.0001
  • Release:b.15.05.21.01
    */
    class CsstoJson{php

    /**
    * CSS批量导入功能
    * @function ImportCss
    * @param $data{xxx:XXX; yyy:YYY;}
    * @Description 按照必定规则导入CSS样式结构入库
    * @return boolean
    */
    public function ImportCss($post){
    $data = str_replace("}","}&",$post); # 将}替换成}&
    $data =explode('&',$data); # &用于切割每一个css样式表到数组
    array_pop($data); # 去掉最后一个数组元素
    $JsonData =self:: arrayToCss($data);
    $length =1-count($JsonData);
    $JsonData = substr($JsonData,$length,-1); # 截取字符串最后
    $JsonData = "{".$JsonData."}";
    $JsonData = json_decode($JsonData,true); # 转换成json数组
    return $JsonData;
    }css

    /**
    * CSS数据样式化函数
    * @function array_to_css
    * @param $ArrayData 为格式话的css样式数据
    */
    public function arrayToCss($ArrayData){
    $GetData=null;
    //遍历传送过来的数组
    foreach($ArrayData as $key => $arraydatas ){
    $arraydatas = str_replace("{","&{",$arraydatas); # 替换传送过来数据中的 { ,便于以后作字符串转换
    $arraydatas = explode('&',$arraydatas);
    $jsondata = self::strToJson($arraydatas);
    $GetData =$GetData.$jsondata.",";
    }
    return $GetData;
    }前端

    /**
    * 解析数组里面的字符串操做
    * @function strToJson
    * $Strdata 二维数组,里面含有
    */
    public function strToJson($Strdata){
    //替换CSS数据名称
    $Strdata['0'] = str_replace(".","",$Strdata['0']);
    $Strdata['1'] = str_replace("{","",$Strdata['1']);
    $Strdata['1'] = str_replace("}","",$Strdata['1']);
    $temp = null;
    $StrdataChild = explode(';',$Strdata['1']);
    array_pop($StrdataChild);
    foreach($StrdataChild as $key => $StrdataChilds){
    $StrdataChilds = explode(':',$StrdataChilds); # 分解每一个类名下面的属性与具体数值的键值对
    $ProName = trim($StrdataChilds['0']); # 去掉表单字段的空格,否则入库没法识别
    $jsondata = """.$ProName.""".':'.""".$StrdataChilds['1']."","; # 把相似height:10px这样的键值对分开成想要的数据结构
    $temp = $temp.$jsondata; # 操做css的height等具体字段配置关系
    }
    $ClassName = trim($Strdata['0']); # 去掉表单字段的空格,否则入库没法识别数据库

    #获取当前字符串的长度
        $length =1-count($temp);
        #截取字符串最后
        $temp = substr($temp,$length,-1);
        #把当前所属分类名称加入到子集中
        $temp = "\""."classname"."\"".":"."\"".$ClassName."\"".",".$temp;
        return "\"".$Strdata['0']."\"".":"."{".$temp."}";
    }

    }json

    $cssdata = ".wrapper .box{border:1px #e1e1e1 solid;}.wrapper .box .title{height:31px;border-bottom:1px #e1e1e1 solid;line-height:30px;}";
    $toJson = new CsstoJson();
    $reData = $toJson->ImportCss($cssdata);
    var_dump($reData);数组

思路分析


  • 我这里是已经封装成一个类了,起哄三个函数分别处理了什么事情呢?
  • 第一个函数importCss咱们把批量的css数据根据大括号的多少切割多少个数组
  • 而后把切割好的数据传值到第二个函数,而后遍历数组便可对每一组数据进行处理,再根据每个css语句都是以分好结束做为数组分隔符切割成数组
  • 第三个函数既是对分割好的数组按照json键值对的方式组合好。

总结


  • 函数的复用性仍是不是很高,但愿各位看官若是有更好的方法,欢迎拍砖讨论。

若是您有任何意见或建议,请联系做者数据结构

相关文章
相关标签/搜索