我需要一些RegEx的帮助,它应该将cssText(不是选择器,但{}内部的部分)与PHP中的key->值对数组相关联
假设删除了选择器部分,例如:
color: black;
font-family: \"Courier New\";
background: url(\"test.png\");
color: red;
是的,字符串被转义我在提取{}部分时设法做到了。
BUT:
如果background是dataURI,或者内容prop支持如下:
content:'1.test;2.blabla;';
background: white url('data:image/png;base64,iVBORw0KGgoAA
AANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABl...') no-repeat scroll left top;
分裂RegEx我使用:
preg_match_all('/([\w-]+)\s*:\s*([^;]*)\s*;?/i', $css, $matches, PREG_SET_ORDER);
失败:(
我不是RegEx的专家,需要你的建议如何不刹车';'在字符串内部出现“......”。
它应该在捕获组([^;] *)中,正如我发现的那样: 匹配任何不是的单个字符;并重复0次或更多次。
提前致谢!
答案 0 :(得分:1)
如果这不是出于学习目的,我真的建议使用库而不是重新发明轮子:)类似于https://github.com/sabberworm/PHP-CSS-Parser。
答案 1 :(得分:0)
如果您不关心评论,可以使用类似的内容来处理带有转义的引用内容:
/([\w-]++) \s*+ : \s*+ ( (?: [^;'"]++ | "(?:[^"\\]|\\.)*+" | '(?:[^'\\]|\\.)*+' )*+ ) \s* ;?/x
(在PHP中引用时,不要忘记加倍+转义\\
。)
答案 2 :(得分:0)
我正在使用一个简单的状态机来创建一个简单的parseCSS
函数。您可以阅读代码,并可以进一步扩展到您需要的内容。算法的复杂性是O(N),其中N是css的长度。
function parseCSS($css)
{
// State variable
$isOption = true; $isValue = false; $isQuote = ''; $arr=array();
// Buffer variable
$option = ''; $value = '';
for($i = 0; $i < strlen($css); $i++) {
if ($isOption) {
if ($css[$i] == ':') {
$isValue = true; $isOption = false;
} else {
$option .= $css[$i];
}
} elseif ($isValue) {
if ($isQuote == $css[$i]) {
$isQuote = ''; $value .= $css[$i];
} elseif ($isQuote != '') {
$value .= $css[$i];
} else {
if (($css[$i] == "'") || ($css[$i] == '"')) {
$isQuote = $css[$i]; $value .= $css[$i];
} elseif ($css[$i] == ';') {
$arr[trim($option)] = trim($value);
$option = ''; $value = '';
$isOption = true; $isValue = false;
} else {
$value .= $css[$i];
}
}
}
}
return $arr;
}
$css = parseCSS
(
"content:'1.test;2.blabla;';
background: white url('data:image/png;base64,iVBORw0KGgoAA
AANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABl...') no-repeat scroll left top;"
);
var_dump($css);
答案 3 :(得分:0)
使用此功能
function BreakCSS($CSS) {
$results = array();
foreach(explode(';', $CSS) AS $attr)
if (strlen(trim($attr)) > 0) // for missing semicolon on last element, which is legal
{
list($name, $value) = explode(':', $attr);
$results[trim($name)] = trim($value);
}
return $results;
}