PHP CSS из строки в массив

1

Это должно быть просто как-то, но я не могу понять это и уже в течение всего дня.

Я хочу проанализировать CSS файл в массиве с ключами и значениями, подобными этому:

Array('#idname' => Array('overflow' => hidden, 'color' => '#FFF'));

Я игнорирую все медиа-запросы, удаляя их с помощью регулярного выражения, а также удаляю все пробелы.

//Remove all media queries
$cssFromLink = preg_replace("/@media.*?}}/i", '', $cssFromLink);
//Remove all whitespace
$cssFromLink = str_replace(' ','', $cssFromLink);

Все, что я хочу, это иметь возможность искать в списке идентификатор или имя класса, а затем извлекать свойство, подобное фоновому цвету.

Библиотеки, такие как Sabberworm и другие синтаксические анализаторы CSS, похоже, не работают для меня, они либо кажутся навсегда, либо ничего не делают, либо бросают фатальную ошибку. Я пытаюсь это сделать на css с apple.com.

Все остальные решения выглядят одинаково сложными для меня, но почти никто из них, похоже, не работает на apple.com, и я не могу его крушить на популярных веб-сайтах.

Теги:
parsing

2 ответа

1
Лучший ответ

Ответ от JapanPro на Parse: файл CSS с PHP работает лучше всего для меня. У него все еще есть некоторые ошибки (a) перед некоторыми id), и я не уверен, что использование regex - лучший способ проанализировать его для каждой ситуации, но пока я буду использовать это.

<?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($attr) > 0) // for missing semicolon on last element, which is legal
                {
                        // Explode on the CSS attributes defined
                        list($name, $value) = explode(':', $attr);
                        $results[$matches[1][$i]][trim($name)] = trim($value);
                }
    return $results;
}
var_dump(BreakCSS($css));
0

Я просто сделал это, попробуйте:

<?php

    //To test
    $string = "#id {
        overflow: hidden;
        color: #fff;
    }
    #id2 {
        margin: 0px;
        height: 100%;
    }";

    //Call the function and print it out
    $css_array = cssToArray($string);
    echo "<pre>";
    print_r($css_array);

    //The actual function
    function cssToArray($css){
        //Regex to find tags and their rules
        $re = "/(.+)\{([^\}]*)\}/";
        preg_match_all($re, $css, $matches);

        //Create an array to hold the returned values
        $return = array();
        for($i = 0; $i<count($matches[0]); $i++){
            //Get the ID/class
            $name = trim($matches[1][$i]);

            //Get the rules
            $rules = trim($matches[2][$i]);

            //Format rules into array
            $rules_a = array();
            $rules_x = explode(";", $rules);
            foreach($rules_x as $r){
                if(trim($r)!=""){
                    $s = explode(":", $r);
                    $rules_a[trim($s[0])] = trim($s[1]);
                }
            }

            //Add the name and its values to the array
            $return[$name] = $rules_a;
        }

        //Return the array
        return $return;
    }
  • 0
    По крайней мере, что-то сделал. Но это вышло как этот s14.postimg.org/uabenw735/resultcss.png
  • 0
    Это потому, что ваше последнее правило в каждом сете не имеет финала ;
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню