Analizar un archivo CSS con PHP

Quiero analizar (de una manera especial) un archivo CSS con PHP.

Ejemplo:

cssfile.css :

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

Y quiero que PHP me devuelva cada nombre de clase que tiene la clase de publicación en su nombre.

El resultado parece una matriz que tiene en este ejemplo:

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

Pero soy peor en expresiones regulares. de alguna manera busque “postclass” y luego dibuje la línea del hoyo y ponga en una matriz.


gracias y lo usé para analizar un archivo css similar a un archivo 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('
'); }); } }); });

fue mi código final entonces puedo ajustar fácilmente un div alrededor de algunos hardcode-html sin editar el diseño. entonces solo tengo que editar mi cssfile y agregar algo como

id .postclass-class {algunos estilos}

y mi código busca el ID y envuelve el contenido interno con un div. Lo necesitaba para las soluciones rápidas cuando solo tengo que agregar un div alrededor de algo para borrar o como fondo.

Aquí hay un truco independiente rápido y sucio usando regex:

 $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]); 

Resultados en:

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

Hay una muy buena clase de analizador de CSS en PHP. Úselo. Aquí está su código de muestra:

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

Encontré una solución:

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

utilizar:

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

Para completar, también hay otra biblioteca para analizar CSS: sabberworm / PHP-CSS-Parser .

Página de inicio: 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
Última actualización: 31 de mayo de 2017 (indicando esto porque la fecha en la entrada del blog puede inducir a error que ya no se actualiza).

Lamentablemente, este proyecto es demasiado robusto. Desde CSS bastante simple crea una estructura muy hablador. Además, antes del primer uso, debe tratar con el compositor (yo mismo terminé añadiendo require_once para cada archivo en parser.php).

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

// veo su mismo

Además de la respuesta de Gabriel Anderson para manejar consultas de css @media, selector de niños > , imágenes de base64 y 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; } 

Recursos

    Intereting Posts