干货,小程序清除冗余css样式,清除多余css样式PHP版
写在前面的一些废话
最近微信小程序项目快要上线了,在开发工具的Audits里看了下,说是建议清除多余css样式,搜了下看没有相关的工具,无奈只能自己动手丰衣足食了。
项目快一个月了,上个月写css的妹子离职了,挺想她的,她喜欢粉色,并且我和她经常一起喝奶茶,真的很想她!不多说了先上代码。
PS:此处省略一千万字…
/*
* 小程序清除冗余css样式
* by 尧曳网络 2020-06-29
* 步骤:
* 1、创建一个php文件,复制以下代码进去保存,更改变量$wxmlFolder为你的小程序pages目录路径,$publicCssPath为公共css路径
* 2、确认wxml文件中的class、id属性=号两边是否有多余空格或是否单或双引号,视情况更改$pattern正则匹配变量值(可在工具搜索看看有哪些class或id不同的形式)
* 3、建议在替换前确认所有已获得的css和id名称是否正确
* 4、提取结果只匹配“#”、“.”和":"伪类的样式,公共和引入的样式需要手动提取,最后将提取出的css保存为另外一个文件进行测试即可
*/
$wxmlFolder = '******/pages/';
$publicCssPath = '******/app.wxss';
//提取样式
function extractCss($content, $pattern)
{
$css="";
preg_match_all($pattern, $content, $matches);
foreach ($matches[1] as $item) {
preg_match_all("/'(.+?)'/is", $item, $Vmatches);
foreach ($Vmatches[1] as $Vitem) {
$css.=$Vitem." ";
}
preg_match_all("/\"(.+?)\"/is", $item, $Vmatches);
foreach ($Vmatches[1] as $Vitem) {
$css.=$Vitem." ";
}
$item = preg_replace('/{{(.+?)}}/is', '', $item);
$css.=$item." ";
}
return $css;
}
/*获得所有样式文件*/
function getAllWxmlFile($folder)
{
$files = scandir($folder);
foreach ($files as $file) {
if ($file != '.' && $file != '..') {
if (is_dir($folder . '/' . $file)) {
getAllWxmlFile($folder . '/' . $file);
} else {
$GLOBALS["wxmlList"][] = $folder . '/' .$file;
}
}
}
}
/*获得所有样式*/
function getAllCss($folder)
{
global $wxmlList;
global $wxml;
global $css;
getAllWxmlFile($folder);
foreach ($wxmlList as $file) {
if (strpos($file, '.wxml') !== false) {
$wxml[]=$file;
}
}
//取消注释查看文件列表
//echo json_encode($wxml);
//die();
foreach ($wxml as $path) {
$fs = fopen($path, "r");
$content = fread($fs, filesize($path));
fclose($fs);
//class="" 双引号
$css[] = extractCss($content, '/class="(.+?)"/is');
//class='' 单引号
$css[] = extractCss($content, '/class=\'(.+?)\'/is');
//id="" 双引号
$css[] = extractCss($content, '/id="(.+?)"/is');
//id='' 单引号
$css[] = extractCss($content, '/id=\'(.+?)\'/is');
}
$cssRes="";
foreach ($css as $item) {
$cssRes.=$item." ";
}
$allCss=array();
$cssRes=explode(" ", $cssRes);
foreach ($cssRes as $v) {
$v = preg_replace('/\'/is', '', $v);
$v = preg_replace('/{{(.+?)\?/is', '', $v);
$v = preg_replace('/}}/is', '', $v);
$v = preg_replace('/:/is', '', $v);
if (!empty($v)) {
if (!in_array($v, $allCss)) {
$allCss[]=$v;
}
}
}
//取消注释查看css列表
//echo json_encode($allCss);
//die();
return $allCss;
}
/*获得所有样式*/
function showAllCss($res)
{
$fs = fopen($GLOBALS["publicCssPath"], "r");
$publicCss = fread($fs, filesize($GLOBALS["publicCssPath"]));
fclose($fs);
//替换注释
$publicCss = preg_replace('/\/\*(.+?)\*\//is', '', $publicCss);
//查找css并提取出来
$allCss = array();
foreach ($res as $item) {
//":"
$patternCss="/(\. *".$item.":(.+?) *{(.+?)})/is";
preg_match_all($patternCss, $publicCss, $matches);
$_id=implode($matches[1]);
if (!empty($_id)) {
$allCss[]=$_id;
}
//"."
$patternCss="/(\. *".$item." *{(.+?)})/is";
preg_match_all($patternCss, $publicCss, $matches);
$_css=implode($matches[1]);
if (!empty($_css)) {
$allCss[]=$_css;
}
//"#"
$patternCss="/(\# *".$item." *{(.+?)})/is";
preg_match_all($patternCss, $publicCss, $matches);
$_id=implode($matches[1]);
if (!empty($_id)) {
$allCss[]=$_id;
}
}
$allCssContentRes=array();
foreach ($allCss as $v) {
$allCssContentRes[]=$v;
}
foreach ($allCssContentRes as $k=>$v) {
$allCssContentRes[$k] = preg_replace('/\r\n/is', '', $v);
$allCssContentRes[$k] = preg_replace('/\t/is', '', $allCssContentRes[$k]);
}
return $allCssContentRes;
}
$res = getAllCss($wxmlFolder);
$allCss = showAllCss($res);
echo implode($allCss);
至此,运行后看上去似乎已经输出了一些样式,将结果另存为文件,__然后把原来公共样式文件里的一些公共样式需要手动加入一下__就可以了。
说实话,1999年编程至今孤身一人,当年看着马云、同程、携程、京东等崛起,甚至错过了炒玉米、小游戏等,落魄潦倒不堪至今,也就只能写点代码慰藉心灵了。
真想她,她写的css是那么的优雅,我认为她就是编程界的一股清流,可现在她从北京去了杭州,不知道还能不能和她联系上,也许……。
未完待续-----