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


业务需求

我相信很多同学有过做一个自定义建站系统的想法,好比某空间的自定义拖拽组件,如果想要实现一个可视化建站系统,那CSS作为前端样式而言,是必须要存入到数据库中作为配置项的,所以,这里不可避免的需要对css做解析,我这里给出我的解析方法,当然还有很大的优化空间,这只是一个初版,实现了最原始的解析过程,希望大家拍砖。

实现方法

  • 话不多说,先上代码,咱们先睹为快。
 /**
  * Css解析成json类
  * Author:dreamzk
  * Data: 2015.05.21.0001
  * Release:b.15.05.21.01
  */
 class CsstoJson{
     
      /**
     	* 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数据样式化函数
     	  * @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."}";
    	} 
}

    $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键值对的方式组合好。

总结


  • 函数的复用性还是不是很高,希望各位看官如果有更好的方法,欢迎拍砖讨论。

如果您有任何意见或建议,请联系作者

版权声明:本文为dream-zk2014原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dream-zk2014/p/4521179.html