用PHPparsing一个CSS文件

我想用一个特殊的方式parsing一个CSS文件。

例:

cssfile.css

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

而且我希望PHP返回给我名字中包含postclass的每个类名称。

结果看起来像这个例子中的数组:

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

但是我在正则expression式上更糟。 以某种方式search“postclass”,然后抓住洞线并放入一个数组。


谢谢,我用它来parsing一个css文件似乎是一个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] + '" />'); }); } }); }); 

是我的最终代码。 所以我可以很容易地围绕一些硬编码HTML的div编辑布局。 所以我只需要编辑我的cssfile并添加类似的东西

ID .postclass-class {一些样式}

并且我的代码searchid并用div封装内部内容。 我需要的quickfixes,当我只需要添加一个明确的东西或背景的东西。

这是一个使用正则expression式的快速和肮脏的独立黑客攻击:

 $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中有一个很好的CSSparsing器类 。 用它。 这是它的示例代码:

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

我find一个解决scheme:

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

为了完整起见,还有另一个用于parsingCSS的库: sabberworm / PHP-CSS-Parser

主页: http : //www.sabberworm.com/blog/2010/6/10/php-css-parser
GitHub: http : //github.com/sabberworm/PHP-CSS-Parser
要点: http : //packagist.org/packages/sabberworm/php-css-parser
最后更新:2014年4月10日(说明这是因为在博客条目中的date可能会误导你,它不会更新了。)

不幸的是这个项目太强大了。 从相当简单的CSS创build非常健谈的结构。 另外在第一次使用之前,你必须处理composer php(我本人最终为每个文件添加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)); 

// 看见它一样

除了加布里埃尔·安德森(Gabriel Anderson)处理css @media查询,孩子select器> ,base64图像和input[type="button"]:hover的答案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; } 

资源