多维CSS转换为PHP数组时正则解析异常如何解决
解决方案
问题核心原因
原有正则匹配规则仅支持单层大括号结构,无法识别@keyframes这类包含嵌套大括号的CSS语法,会在遇到第一个闭合大括号时就终止匹配,最终导致选择器提取错误、嵌套层级丢失。
修改后的解析代码
function parseCSS($css) { $results = []; // 递归匹配带嵌套的平衡大括号结构 preg_match_all('/([^{}]+)\s*({(?:[^{}]+|(?2))*})/', $css, $matches); foreach ($matches[0] as $i => $original) { // 清理选择器前后多余的闭合大括号、空白字符 $selector = trim($matches[1][$i], " }\t\n\r\0\x0B"); if (empty($selector)) continue; // 提取大括号内的原始内容 $content = trim(substr($matches[2][$i], 1, -1)); // 判断内容是否还包含嵌套大括号,是则递归解析 if (strpos($content, '{') !== false) { $results[$selector] = parseCSS($content); } else { // 无嵌套则解析为CSS属性键值对 $attrs = []; foreach (explode(';', $content) as $attr) { $attr = trim($attr); if (empty($attr)) continue; list($name, $value) = explode(':', $attr, 2); $attrs[trim($name)] = trim($value); } $results[$selector] = $attrs; } } return $results; }
调整点说明
- 将原有的单层大括号匹配正则替换为支持递归匹配的平衡大括号规则,可正确提取包含嵌套结构的CSS块内容
- 新增选择器清理逻辑,去除多余的闭合大括号和空白字符,避免出现
}@keyframes这类错误选择器 - 新增嵌套判断逻辑,当块内容还包含大括号时递归调用解析函数,完整保留@keyframes等语法的多维结构
- 属性拆分时为
explode增加第三个参数2,避免属性值中包含冒号时拆分错误
内容的提问来源于stack exchange,提问作者user3436467
相关产品推荐
相关产品推荐

