[PHP]清理js文件

花了点时间好好做了个可以清理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

本站文章未经文下加注授权不得拷贝发布。

本博客使用Disqus评论系统,如果看不到评论框,请尝试爬墙。