Анализ файла CSS с помощью PHP

Я хочу проанализировать (особым образом) файл CSS с PHP.

Пример:

cssfile.css :

 #stuff { background-color: red; } #content.postclass-subcontent { background-color: red; } #content2.postclass-subcontent2 { background-color: red; } 

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

Результат выглядит как массив, имеющий в этом примере:

 arrayentry1: #content.postclass-subcontent arrayentry2: #content2.postclass-subcontent2 

Но я хуже в регулярных выражениях. как-то ищите «postclass», а затем захватывайте линию дыр и помещайте в массив.


спасибо, и я использовал его для разбора файла css simliar в confic-файл.

 $(function () { $.get('main.css', function (data) { data = data.match(/(#[a-z0-9]*?\ .?postclass.*?)\s?\{/g); if (data) { $.each(data, function (index, value) { value = value.substring(0, value.length - 2); $(value.split(' .')[0]).wrapInner('<div class="' + value.split('.')[1] + '" />'); }); } }); }); 

был моим окончательным кодом. поэтому я могу легко обернуть div вокруг некоторого hardcode-html без редактирования макета. поэтому мне просто нужно отредактировать свой cssfile и добавить туда что-то вроде

id .postclass-class {some styles}

и мой код ищет идентификатор и обертывает внутренний контент div. Мне нужно это для fastfixes, когда мне просто нужно добавить div вокруг чего-то для ясного или фона.

Related of "Анализ файла CSS с помощью PHP"

Вот быстрый и грязный автономный взлом с использованием регулярного выражения:

 $input = ' #stuff { background-color: red; } #content.postclass-subcontent { background-color: red; } #content2.postclass-subcontent2 { background-color: red; } '; $cssClassName = 'postclass'; preg_match_all('/(#[a-z0-9]*?\.?'.addcslashes($cssClassName, '-').'.*?)\s?\{/', $input, $matches); var_dump($matches[1]); 

Результаты в:

 array(2) { [0]=> string(29) "#content.postclass-subcontent" [1]=> string(31) "#content2.postclass-subcontent2" } 

В PHP есть очень хороший класс парсера CSS . Используй это. Вот пример кода:

 <?php include("cssparser.php"); $css = new cssparser(); $css->ParseStr("b {font-weight: bold; color: #777777;} b.test{text-decoration: underline;}"); echo $css->Get("b","color"); // returns #777777 echo $css->Get("b.test","color");// returns #777777 echo $css->Get(".test","color"); // returns an empty string ?> в <?php include("cssparser.php"); $css = new cssparser(); $css->ParseStr("b {font-weight: bold; color: #777777;} b.test{text-decoration: underline;}"); echo $css->Get("b","color"); // returns #777777 echo $css->Get("b.test","color");// returns #777777 echo $css->Get(".test","color"); // returns an empty string ?> 

Я нашел решение:

 function parse($file){ $css = file_get_contents($file); 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])); $rules_arr = array(); foreach ($rules as $strRule){ if (!empty($strRule)){ $rule = explode(":", $strRule); $rules_arr[trim($rule[0])] = trim($rule[1]); } } $selectors = explode(',', trim($selector)); foreach ($selectors as $strSel){ $result[$strSel] = $rules_arr; } } return $result; } $css = parse('css/'.$user['blog'].'.php'); 

использовать:

 $css['#selector']['color']; 

Для полноты есть еще одна библиотека для синтаксического анализа CSS: sabberworm / PHP-CSS-Parser .

Домашняя страница: http://www.sabberworm.com/blog/2010/6/10/php-css-parser
GitHub: http://github.com/sabberworm/PHP-CSS-Parser
Gist: http://packagist.org/packages/sabberworm/php-css-parser
Последнее обновление: 2014-04-10 (заявив об этом, потому что дата в записи в блоге может ввести вас в заблуждение, что она больше не обновляется).

К сожалению, этот проект слишком прочен. Из довольно простого CSS создается очень чатная структура. Также перед первым использованием вам приходится иметь дело с композитором (я сам делал в конце добавление require_once для каждого файла в parser.php).

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

// видеть то же самое

В дополнение к ответу Габриэля Андерсона для обработки запросов css @media, селектора child > , изображений base64 и input[type="button"]:hover

 function parse_css_selectors($css,$media_queries=true){ $result = $media_blocks = []; //---------------parse css media queries------------------ if($media_queries==true){ $media_blocks=parse_css_media_queries($css); } if(!empty($media_blocks)){ //---------------get css blocks----------------- $css_blocks=$css; foreach($media_blocks as $media_block){ $css_blocks=str_ireplace($media_block,'~£&#'.$media_block.'~£&#',$css_blocks); } $css_blocks=explode('~£&#',$css_blocks); //---------------parse css blocks----------------- $b=0; foreach($css_blocks as $css_block){ preg_match('/(\@media[^\{]+)\{(.*)\}\s+/ims',$css_block,$block); if(isset($block[2])&&!empty($block[2])){ $result[$block[1]]=parse_css_selectors($block[2],false); } else{ $result[$b]=parse_css_selectors($css_block,false); } ++$b; } } else{ //---------------escape base64 images------------------ $css=preg_replace('/(data\:[^;]+);/i','$1~£&#',$css); //---------------parse css selectors------------------ preg_match_all('/([^\{\}]+)\{([^\}]*)\}/ims', $css, $arr); foreach ($arr[0] as $i => $x){ $selector = trim($arr[1][$i]); $rules = explode(';', trim($arr[2][$i])); $rules_arr = []; foreach($rules as $strRule){ if(!empty($strRule)){ $rule = explode(":", $strRule,2); if(isset($rule[1])){ $rules_arr[trim($rule[0])] = str_replace('~£&#',';',trim($rule[1])); } else{ //debug } } } $selectors = explode(',', trim($selector)); foreach ($selectors as $strSel){ if($media_queries===true){ $result[$b][$strSel] = $rules_arr; } else{ $result[$strSel] = $rules_arr; } } } } return $result; } function parse_css_media_queries($css){ $mediaBlocks = array(); $start = 0; while(($start = strpos($css, "@media", $start)) !== false){ // stack to manage brackets $s = array(); // get the first opening bracket $i = strpos($css, "{", $start); // if $i is false, then there is probably a css syntax error if ($i !== false){ // push bracket onto stack array_push($s, $css[$i]); // move past first bracket $i++; while (!empty($s)){ // if the character is an opening bracket, push it onto the stack, otherwise pop the stack if ($css[$i] == "{"){ array_push($s, "{"); } elseif ($css[$i] == "}"){ array_pop($s); } $i++; } // cut the media block out of the css and store $mediaBlocks[] = substr($css, $start, ($i + 1) - $start); // set the new $start to the end of the block $start = $i; } } return $mediaBlocks; } 

Ресурсы