花了点时间好好做了个可以清理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
本站文章未经文下加注授权不得拷贝发布。
这么狠…
啥这么狠。。。