2016-11-13 126 views
0

我想將樣式表分割成數組,每個選擇器都以他的樣式分隔數組。到目前爲止,我有這個代碼,它運行良好,但不存在媒體查詢的情況。我想實現的是將媒體查詢中的選擇器拆分爲單個數組,但每個數組都有他的媒體查詢選擇器。 這是實施例的風格HTMLPHP - 將樣式表分割成數組

<style> 
#abc{ background-color: gray; font-size: 10px;} 
.abc { background-color: gray; font-size: 10px;} 

@media only screen and (max-width:640px) { 
    #abc { 
    height: 200px !important; 
    } 
} 

@media only screen and (max-width:640px) { 
    #abcd { 
    height: 200px !important; 
    } 
    .abcd { 
    height: 200px !important; 
    } 
} 
</style> 

這是代碼,我到目前爲止有:

$dom = new DomDocument(); 
@$dom->loadHTML($html); 
$para = $dom->getElementsByTagName('style'); #DOMNodeList 
if ($para instanceof DOMNodeList) { 
    foreach ($para as $node) { 
     printf ($node->nodeValue); 
} 
} 
$file = $node->nodeValue; 

$arrs = explode('}', $file); 

for ($i = 0; $i < count($arrs); $i++) 
{ 
    echo 'style ' . $i . ' - ' . $arrs[$i] . '<br />'; 
} 

這是uotput我越來越:

style 0 - #abc{ background-color: gray; font-size: 10px; 
style 1 - .abc { background-color: gray; font-size: 10px; 
style 2 - @media only screen and (max-width:640px) { #abc { height: 200px !important; 
style 3 - 
style 4 - @media only screen and (max-width:640px) { #abcd { height: 200px !important; 
style 5 - .abcd { height: 200px !important; 

通緝輸出:

style 0 - #abc{ background-color: gray; font-size: 10px; 
style 1 - .abc { background-color: gray; font-size: 10px; 
style 2 - @media only screen and (max-width:640px) { #abc { height: 200px !important; 
style 3 - 
style 4 - @media only screen and (max-width:640px) { #abcd { height: 200px !important; 
style 5 - @media only screen and (max-width:640px) { .abcd { height: 200px !important; 

什麼是w應該是正確的方法來獲得?

+0

'如果($段的instanceof的DOMNodeList){':這個測試是沒用的,'$ para'始終是一個'DOMNodeList'情況下,即使沒有任何'風格'標籤。爲什麼使用'printf($ node-> nodeValue);'?寫'echo $ node-> nodeValue;',不需要格式化。 –

+0

要回答你的主要問題,正確的方法是propably找到一個CSS解析庫:http://github.com/sabberworm/PHP-CSS-Parser –

+0

@CasimiretHippolyte,我試過,但分析器不支持媒體查詢。這是一個開放的問題仍然 – codexy

回答

0

你可以嘗試這樣的事情,只要記住這個答案,需要知道或確保媒體查詢的樣式表的最後一部分,有一個媒體和彼此之間聲明沒有其他款式,下面你的例子的格式。然後,你可以做這樣的事情:

... 
$file = $node->nodeValue; 
$parts = explode('@media', $file); 


// The first part of the stylesheet, where there are no media queries 
$styleCount = 0; 
$arrs = explode('}', $parts[0]); 
for ($i = 0; $i < count($arrs); $i++) 
{ 
    echo 'style ' . $i . ' - ' . $arrs[$i] . '<br />'; 
    $styleCount++; 
} 

// The media queries, remember to validate that there exists at least one before 
for ($i = 1; $i < count($parts); $i++){ 
    $arrs = explode('{', $parts[$i], 2); 
    $title = "@media " . $arrs[0]; 

    $arrIn = explode('}', $arrs[1]); 
    for($j = 0; $j < count($arrIn); $j++){ 
     // Validate for an empty space or a new line, it could be just something like strlen($arrIn[$j]) > 3 
     if(strlen($arrIn[$j]) > 4){ 
      echo 'style ' . $styleCount . ' - ' . $title . " { " . $arrIn[$j] . '</br>'; 
      $styleCount++; 
     } 
    } 
} 
+0

這是我得到的輸出: 風格1 - 。 abc {background-color:gray; font-size:10px; (最大寬度:640px)樣式4 - 僅媒體屏幕和(最大寬度:640px)樣式5 - 僅媒體屏幕和(最大寬度:640px)樣式2 - 樣式3 - 寬度:640像素){ 式6 - @媒體僅屏幕和(最大寬度:640像素){ 風格7 - @媒體僅屏幕和(最大寬度:640像素){ 風格8 - @媒體僅屏幕和(最大-width:640像素){ 風格9 - @媒體只是屏幕(最大寬度:640像素){ – codexy

+0

對不起我嘗試編輯答案,我做了一些修正,比如使用的'$ arrIn [$ J]'$,而不是我 – Moyom

+0

輸出中唯一的變化是空的樣式是#2而不是#3: 'style 0 - #abc {background-color:gray; font-size:10px; style 1 - .abc {background-color:gray; font-size:10px; 風格2 - 風格3 - @media只有屏幕和(最大寬度:640px){#abc {height:200px!important; 風格4 - @media只有屏幕和(最大寬度:640px){#abcd {height:200px!important; 風格5 - @media唯一的屏幕和(最大寬度:640px){.abcd {height:200px!important; ' – Moyom