PHP CSS解析器无法解析属性值中的分号

I'm using this function to parse the CSS files, but when it comes to property values containing semicolon, it breaks. Example:

#logo {
    background-image: url("data:image/png;base64,..................");
}

I changed the explode delimiter to " " but it didn't produce expected results. Please help.

Function:

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;
}

Execution:

$css = parse('content/custom.css');
echo print_r($css);
dongshanyan0322
dongshanyan0322 我已经尝试过sabberworm,它就像一个坦克,需要一些其他的库。我不需要坦克来进行简单的解析......
5 年多之前 回复
dtwvr26066
dtwvr26066 我将把它留在这里:github.com/sabberworm/PHP-CSS-Parser
5 年多之前 回复
dongqian6484
dongqian6484 哦!我现在知道了
5 年多之前 回复
douqiang4501
douqiang4501 这个方法提供了数组,它与echo不同。[#logo]=>数组([background-image]=>url(“data[base64,...................”]]=>[background-size]=>自动100%)。我正在尝试获取background-image的有效属性值。=)
5 年多之前 回复
dongnvwang8591
dongnvwang8591 该方法应该做什么?您的解析函数与直接回显css文件有什么区别?从代码中不是很明显
5 年多之前 回复

1个回答



如何为密集的; base64 </ code>使用临时占位符字符串,然后进行拆分,然后恢复 回来,比如:</ p>

替换这一行:</ p>

  $ rules = explode(';',trim($ arr [2]  ] [$ i])); 
</ code> </ pre>

使用:</ p>

  // replace; base64 with a placeholder

$ placeholder = uniqid();
$ arr [2] [$ i] = str_replace(“; base64”,$ placeholder,$ arr [2] [$ i]);
// explode
$ rules = explode(';',trim($ arr [2] [$ i]));
//从占位符恢复
$ rules = array_map(function($ el){
return str_replace($ placeholder, “; base64”,$ el);
},$ rules);
</ code> </ pre>
</ div>

展开原文

原文

What about using a temporary place holder string for the offsensive ;base64, then do the split, then restore it back, something like:

Replace this line:

 $rules = explode(';', trim($arr[2][$i]));

with this:

//replace ;base64 with a placeholder
$placeholder=uniqid();
$arr[2][$i] = str_replace(";base64",$placeholder,$arr[2][$i]);
//explode
$rules = explode(';', trim($arr[2][$i]));
//restore from placeholder
$rules = array_map(function ($el) {
    return str_replace($placeholder, ";base64", $el);
}, $rules);

duandang2123
duandang2123 touche :-)
5 年多之前 回复
ds78662302
ds78662302 那么,你需要改变你的方法...... =))
5 年多之前 回复
dongshao9106
dongshao9106 如果我是一个疯狂的混蛋,经常在单行上写样式,如某些选择器{margin:0 auto; background-image:url(“data:image / png; base64,..................”); }? ;-)
5 年多之前 回复
douchensou6495
douchensou6495 理想的方法是在:和; (换行符)之间获取属性值。
5 年多之前 回复
dongluanguang4774
dongluanguang4774 哦,我想在内容中:规则将是另一个
5 年多之前 回复
doukoumi3389
doukoumi3389 还有什么其他例外,除了; base64之外,分号不表示样式的结尾?
5 年多之前 回复
douzuo0711
douzuo0711 如果有其他东西而不是base64怎么办? 这不是非常可靠的解决方案... =)
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐