CSS を json 形式にバッチ解析するための php クラスをカプセル化する
我相信很多同学有过做一个自定义建站系统的想法,好比某空间的自定义拖拽组件,如果想要实现一个可视化建站系统,那CSS作为前端样式而言,是必须要存入到数据库中作为配置项的,所以,这里不可避免的需要对css做解析,我这里给出我的解析方法,当然还有很大的优化空间,这只是一个初版,实现了最原始的解析过程,希望大家拍砖。
/**
リリース: b.15.05.21.01
*/
Cs stoJson{
/**
* 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);
ご意見やご提案がございましたら、作者までご連絡ください