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

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

Я хочу проанализировать файл 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);

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

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

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

1

Решение

Ответ от JapanPro на Разобрать файл CSS с помощью PHP работает лучше для меня. В нем все еще есть некоторые ошибки (a} перед некоторыми идентификаторами), и я не уверен, является ли использование 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));
1

Другие решения

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

<?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

По вопросам рекламы [email protected]