0

我需要一些关于 RegEx 的帮助,它应该将 cssText(不是选择器,而是 {} 中的部分)与 PHP 中的键-> 值对数组关联起来

假设选择器部分已删除,例如:

color: black;
font-family: \"Courier New\";
background: url(\"test.png\");
color: red;

是的,字符串被转义了,我在提取 {} 部分时确实做到了。

但:

如果背景是 dataURI 或者设置了如下内容属性:

content:'1.test;2.blabla;';
background: white url('data:image/png;base64,iVBORw0KGgoAA
AANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABl...') no-repeat scroll left top;

我使用的拆分正则表达式:

preg_match_all('/([\w-]+)\s*:\s*([^;]*)\s*;?/i', $css, $matches, PREG_SET_ORDER);

失败:(

我不是 RegEx 的专业人士,需要您就如何踩“;”提出建议 出现在字符串内的 \"...\" 内。

它应该在捕获组 ([^;]*) 中,我发现这意味着:匹配任何不是的单个字符;并重复 0 次或更多次。

提前致谢!

4

4 回答 4

1

如果这不是出于学习目的,我真的建议使用库而不是重新发明轮子 :) 像https://github.com/sabberworm/PHP-CSS-Parser之类的东西。

于 2013-08-27T09:51:22.147 回答
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;
}
于 2015-03-03T20:03:40.683 回答
0

如果你不关心评论,你可以使用这样的东西来处理带有转义的引用内容:

/([\w-]++) \s*+ : \s*+ ( (?: [^;'"]++ | "(?:[^"\\]|\\.)*+" | '(?:[^'\\]|\\.)*+' )*+ ) \s* ;?/x

(不要忘记\\在 PHP 中引用时加倍+转义。)

于 2013-08-27T09:46:50.153 回答
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);
于 2013-08-27T09:52:21.503 回答