我想用PHP解析(以特殊方式)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
但我对正则表达式更糟糕。以某种方式搜索“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] + '" />');
});
}
});
});
是我的最终代码。所以我可以很容易地围绕一些hardcode-html包装div而无需编辑布局。所以我只需编辑我的cssfile并添加类似
的内容我的代码搜索id并用div包装内部内容。我需要那些快速修正,当我只需要为清晰或背景添加一个div。
答案 0 :(得分:15)
PHP中有一个非常好的CSS parser class。用它。以下是示例代码:
<?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
?>
答案 1 :(得分:13)
我找到了解决方案:
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'];
答案 2 :(得分:10)
为了完整起见,还有另一个用于解析CSS的库: 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
最后更新:2017年5月31日(说明这一点,因为博客条目中的日期可能会误导您不再更新。)
不幸的是,这个项目有点太健壮。从非常简单的CSS创建非常健谈的结构。在第一次使用之前,你必须处理作曲家(我自己最终将每个文件的require_once添加到parser.php中)。
答案 3 :(得分:2)
<?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));
// see its same
答案 4 :(得分:2)
除了Gabriel Anderson在处理css @media查询,子选择器>
,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;
}
<强>资源强>
答案 5 :(得分:0)
这是一个使用正则表达式的快速而又脏的独立hack:
$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"
}