封裝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鍵值對的方式組合好。

總結


  • 函數的複用性仍是不是很高,但願各位看官若是有更好的方法,歡迎拍磚討論。

若是您有任何意見或建議,請聯繫做者數據結構

相關文章
相關標籤/搜索