PHP ile bir diziye bir CSS dosyası Arası

3 Cevap php

PHP ile bir diziye bir css dosyası kırmak istedim.

Ex:

#selector{ display:block; width:100px; }
#selector a{ float:left; text-decoration:none; }

Bir php diziye ...

array(2) {
  ["#selector"] => array(2) {
    [0] => array(1) {
      ["display"] => string(5) "block"
    }
    [1] => array(1) {
      ["width"] => string(5) "100px"
    }
  }
  ["#selector a"] => array(2) {
    [0] => array(1) {
      ["float"] => string(4) "left"
    }
    [1] => array(1) {
      ["text-decoration"] => string(4) "none"
    }
  }
}

Herhangi bir fikir?

Oh: Edit: Ben bu durumda hasta oluşturulan CSS dosyaları hakkında endişeli değilim. Sürece onun açgözlü değil kurşun geçirmez olması olmayacaklarını gelmez

3 Cevap

Bu yapmak gerekir:

<?php

$css = <<<CSS
#selector { display:block; width:100px; }
#selector a { float:left; text-decoration:none }
CSS;

//
function BreakCSS($css)
{

    $results = array();

    preg_match_all('/(.+?)\s?\{\s?(.+?)\s?\}/', $css, $matches);
    foreach($matches[0] AS $i=>$original)
        foreach(explode(';', $matches[2][$i]) AS $attr)
            if (strlen(trim($attr)) > 0) // for missing semicolon on last element, which is legal
            {
                list($name, $value) = explode(':', $attr);
                $results[$matches[1][$i]][trim($name)] = trim($value);
            }
    return $results;
}
var_dump(BreakCSS($css));

Hızlı Açıklama: sıradanifade basit ve sıkıcı. O sadece tüm "şey, mümkün alanı, kıvırcık dirsek, olası uzay, hiçbir şey yakın kıvırcık dirseğini" eşleşir. Oradan, ilk maç, ikinci maç nitelik listesi, seçici olduğunu. Noktalı virgülle, ve anahtar / değer çiftleri ile kalacaksın ki bölünmüş. Bazı süs () 'ın orada boşluklarla kurtulmak için, ve bunun hakkında.

Ben bir sonraki en iyi bahis muhtemelen vb aynı şey geçerli niteliklerini pekiştirmek, ama ben senin için kaydetmek gerekir ki, bir virgül ile seçici patlamaya olacağını tahmin ediyorum. :)

Edit: Yukarıda belirtildiği gibi, bir gerçek dilbilgisi ayrıştırıcı daha pratik olurdu ... ama iyi oluşturulmuş CSS varsayarak eğer, "bir şey {şey}" basit ötesinde bir şey yapmanız gereken hiçbir neden yok. Eğer gerçekten, onunla yapmak istediğinize bağlıdır.

Eğer çok seçiciler ve breaklines ile CSS kuralları için aynı gerekirse:

<?php                      
$css = "
#selector
{ display:block; 
width:100px; 
}
#selector a:hover div.asd #asd h1.asd { 
float:left; 
text-decoration:none; 
}
";
preg_match_all( '/(?ims)([a-z0-9\s\.\:#_\-@]+)\{([^\}]*)\}/', $css, $arr);

$result = array();
foreach ($arr[0] as $i => $x)
{
    $selector = trim($arr[1][$i]);
    $rules = explode(';', trim($arr[2][$i]));
    $result[$selector] = array();
    foreach ($rules as $strRule)
    {
        if (!empty($strRule))
        {
            $rule = explode(":", $strRule);
            $result[$selector][][trim($rule[0])] = trim($rule[1]);
        }
    }
}   

var_dump($result);
?>

çıktı:

array(2) {
  ["#selector"]=>
  array(2) {
    [0]=>
    array(1) {
      ["display"]=>
      string(5) "block"
    }
    [1]=>
    array(1) {
      ["width"]=>
      string(5) "100px"
    }
  }
  ["#selector a:hover div.asd #asd h1.asd"]=>
  array(2) {
    [0]=>
    array(1) {
      ["float"]=>
      string(4) "left"
    }
    [1]=>
    array(1) {
      ["text-decoration"]=>
      string(4) "none"
    }
  }
}

Ben olsaydım, inşa (veya bulmak) CSS için gerçek bir dilbilgisi ve bu şekilde ayrıştırma yapardı. (Ve CSS açıkça tüm süslü seçiciler ile, önemsiz değildir) önemsiz olmayan herhangi bir ifade dili için bir ayrıştırıcı yazmaya çalışıyorum yeterli kat daha fazla belaya beni aldık.

Örnek: http://www.phpclasses.org/package/1289-PHP-CSS-parser-class.html