
本文介绍如何通过 PHP 的 preg_match_all() 函数,从纯 CSS 字符串中精准提取所有类选择器名称(不含点号、括号、属性等无关内容),并转换为标准索引数组,适用于图标字体类名批量处理、CSS 分析或前端资源自动化管理场景。
本文介绍如何通过 php 的 `preg_match_all()` 函数,从纯 css 字符串中精准提取所有类选择器名称(不含点号、括号、属性等无关内容),并转换为标准索引数组,适用于图标字体类名批量处理、css 分析或前端资源自动化管理场景。
在实际开发中,尤其是处理图标字体(如 IcoMoon、Font Awesome 自定义字体)的 CSS 文件时,常需将所有 .icon-name 类名提取出来,用于动态渲染、权限控制或构建类名白名单。PHP 并未内置 CSS 解析器,但借助正则表达式即可高效完成该任务。
核心思路是:匹配以英文点号 . 开头、后接合法 CSS 类名字符(字母、数字、下划线、短横线)的模式,并捕获其名称部分(即去除前导 .)。
以下为完整可运行示例:
<?php $cssText = <<<'CSS'
.dungarees {
content: "\ef04";
}
.jacket {
content: "\ef05";
}
.jumpsuit {
content: "\ef06";
}
.shirt {
content: "\ef07";
}
CSS;
// 使用正则匹配所有 .xxx 形式的类名,捕获 xxx 部分
$matches = [];
preg_match_all('/\.([\w\-]+)/', $cssText, $matches);
// $matches[1] 是第一个捕获组,即所有类名(不含点)
$myArray = $matches[1];
print_r($myArray);
// 输出:
// Array
// (
// [0] => dungarees
// [1] => jacket
// [2] => jumpsuit
// [3] => shirt
// )
?>
✅ 关键说明:
- 正则 /\.([\w\-]+)/ 中:
- \. 匹配字面量点号(需转义);
- ([\w\-]+) 表示一个捕获组,\w 匹配字母、数字、下划线,\- 显式包含短横线(CSS 类名允许);
- + 确保至少匹配一个字符,避免空类名。
- 该方案不依赖外部库,轻量可靠,适用于静态 CSS 字符串(如读取本地 .css 文件内容后传入 $cssText)。
⚠️ 注意事项:
- 不适用于嵌套 CSS(如 Sass/Less)、带媒体查询或注释的复杂样式表——此时建议使用专业 CSS 解析器(如 sabber/sabber-css-parser);
- 若 CSS 中存在伪类(如 .btn:hover)或属性选择器(如 [class*="icon-"]),本正则会误匹配 hover 或 class,需根据实际结构调整正则(例如限定后跟 { 或空白符);
- 类名含 Unicode 或 escaped 字符(如 .icon-\e600)时,需增强正则,但常规项目中极少出现。
如需进一步扩展,可封装为复用函数:
function extractCssClasses(string $css): array {
preg_match_all('/\.([\w\-]+)/', $css, $matches);
return $matches[1] ?? [];
}
// 使用
$classes = extractCssClasses(file_get_contents('icons.css'));
此方法简洁、高效、无第三方依赖,是处理类名提取任务的推荐实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











