封装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键值对的方式组合好。 总结 函数的复用性还是不是很高,希望各位看官如果有更好的方法,欢迎拍砖讨论。 如果您有任何意见或建议,请联系作者