花了点时间好好做了个可以清理js文件的php脚本,php确实是个蛋疼的东西,老是出点奇怪的特性。
这个脚本的功能是去掉js文件里的无用部分,输出一个清洁的js文件(当然我不保证这个输出的文件绝对没问题,至少把我的COL放进去输出的文件没问题)
原理:
由于涉及到清理注释,又不能把引号误删,而且 `”` `’` `//` `/*`这四个关键符号是同样优先级的,所以谁先出现,谁的优先级就会高(也就是其他符号都会进入这个符号的作用域里)
比如`”` 先出现了,后面的`’` `//` `/*`都会被包括进这个字符串里,同样如果`/*`先出现了后面的内容都会变成注释,除非碰到`*/` 。
所以我用了个循环来根据先出现的符号进行相应操作。碰到引号就把字符串整个提出来放个锚,即可保持字符串内容,然后就不用再担心字符串的问题了。
最后上代码
function cutdownjs($content){ $open=''; $randpre=uniqid().uniqid().uniqid(); $cou=0; $strarray=array(); while(preg_match("/\'|\"|(?:\/\*)|(?:\/\/)/",$content,$open)){ switch ($open[0]) { case "'":case "\"":/*找到单引号开口,推进字符串数组*/ { if(preg_match("/(\'|\").*?(?<!\\\\)\\1/s",$content,$strarr)){ $strid=$randpre.$cou; $cou++; $strarray[$strid]=$strarr[0]; $content = preg_replace("/(\'|\").*?(?<!\\\\)\\1/s",$strid, $content,1); }else{ //找不到引号对说明代码有问题,直接退出并报错 trigger_error("文件引号不成对,文件缩减停止",E_USER_ERROR); exit; } break; } case '/*':/*找到块注释开口,删了它*/ { if(preg_match('/\/\*.*?\*\//s',$content)){ $content = preg_replace('/\/\*.*?\*\//s', '', $content,1); }else{ trigger_error("块注释符号不成对,文件缩减停止",E_USER_ERROR); exit; } break; } case '//':/*找到行注释开口,删了它*/ { $content = preg_replace('/\/\/.*$/m', '', $content,1); break; } } } $content = preg_replace("/^[\t\s]+/m",'', $content); /*去除每行前的tab和空格*/ $content = preg_replace("/^[\r\n]+/m",'', $content); /*去除空白行*/ $specahrs='\:\{\=\+\-\*\/\,\.\;\|\?\\\\\[\]\>\<\&\)'; $content = preg_replace("/[\t\s]*([$specahrs])[\t\s]*/",'$1', $content); $content = preg_replace("/[\r\n]*([$specahrs])[\r\n]*/",'$1', $content); /*最后把字符串全替换回去*/ foreach($strarray as $id => $str){ $content = preg_replace("/$id/", $str, $content,1); } return $content; }
写了一晚上呢喵,要点赞啊!
================更新===============
增加符号不成对报错,以免不知不觉生成错误的文件
本文发布于 https://luojia.me
本站文章未经文下加注授权不得拷贝发布。
这么狠…
啥这么狠。。。