
本文介绍如何使用 php 正则表达式高效提取 css 代码中的类名(不带点号),过滤掉花括号、属性声明等无关内容,并将其安全构建成索引数组。
本文介绍如何使用 php 正则表达式高效提取 css 代码中的类名(不带点号),过滤掉花括号、属性声明等无关内容,并将其安全构建成索引数组。
在前端资源管理或图标字体(如 IcoMoon、Font Awesome)自动化处理场景中,常需从 CSS 文件中批量提取类名用于动态渲染、文档生成或权限控制。PHP 并未内置 CSS 解析器,但借助 preg_match_all() 配合精准正则,可轻量、可靠地完成该任务。
核心思路是匹配以英文句点 . 开头、后接合法 CSS 类名字符(字母、数字、连字符、下划线)的模式,且仅捕获类名主体(即去除 .)。推荐正则表达式为:
/\.([\w\-]+)/
- \. 匹配字面量点号(需转义);
- ([\w\-]+) 捕获组:\w 等价于 [a-zA-Z0-9_],加上 - 支持连字符(CSS 类名常见);+ 表示至少一个字符;
- 该模式自动跳过 { }、冒号、分号、空格及属性值,无需额外清洗。
✅ 完整可运行示例:
<?php $cssText = <<<'CSS'
.dungarees {
content: "\ef04";
}
.jacket {
content: "\ef05";
}
.jumpsuit {
content: "\ef06";
}
.shirt {
content: "\ef07";
}
CSS;
$matches = [];
preg_match_all('/\.([\w\-]+)/', $cssText, $matches);
$myArray = $matches[1]; // 第一捕获组即类名列表
print_r($myArray);
// 输出:
// Array
// (
// [0] => dungarees
// [1] => jacket
// [2] => jumpsuit
// [3] => shirt
// )
?>
⚠️ 注意事项:
- 避免过度匹配:此正则不匹配嵌套选择器(如 .nav .item 中的 .item 是独立匹配的,但 .nav-item 会被整体捕获为 nav-item,符合预期);
- 注释与多行兼容:CSS 注释 /* ... */ 或 //(若为预处理器输出)可能干扰匹配,建议先用 preg_replace('/\/\*.*?\*\//s', '', $cssText) 清理;
- 性能考量:对超大 CSS 文件(>1MB),正则仍高效,但若需解析复杂语法(媒体查询、伪类、BEM 嵌套),建议改用专用库如 sabberworm/PHP-CSS-Parser;
- 安全性:输入应来自可信源(如本地文件),避免直接解析用户提交的 CSS,以防正则回溯攻击(本例无风险,因模式简单)。
总结:一行正则 /.([\w\-]+)/ 即可精准提取类名,配合 preg_match_all() 和 $matches[1],即可将任意格式良好的 CSS 字符串转化为干净的 PHP 字符串数组,简洁、高效、零依赖。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











