ホームページ  >  記事  >  php教程  >  PHP批量去除文件头部Bom信息

PHP批量去除文件头部Bom信息

WBOY
WBOYオリジナル
2016-06-07 11:37:40997ブラウズ

在linux环境下开发的网站,要移植到windows环境下布署,验证码图片在windows下始终显示不出来,linux下显示是正常的,查其原因,应该是加载的文件里头部带了bom信息,导致显示不出来,于是想到了写个批量替换文件头部bom信息。分享给大家~

什么是文件头部Bom? 不知道的童鞋自补一下:查看文章
说白了,就是在保存文件的时候,文件前面会多出一串隐藏的字符,但网站文件那么多,我们手工来重新编辑太麻烦,用下面的程序来批量去除文件头部Bom:

文件名:bom.class.php<?php <br /> /**<br>  * 批量去除文件头bom.<br>  * Author: Simon<br>  * E-mail: vsiryxm@qq.com<br>  * Date: 2015-8-5<br>  */<br> <br> class Bom {<br>     static public $total = 0; //文件数统计<br>     static public $count = 0; //替换数统计<br> <br>     protected $config = array(<br>         'auto' => 1,    // 是否自动替换 1为自动替换<br>         'dir'  => '.',  // 遍历的目录 默认当前<br>         'r'    => 1,    // 1为递归<br>     );<br> <br>     function __construct(){<br>         if(isset($_REQUEST['auto'])){<br>             $this->config['auto'] = $_REQUEST['auto'];<br>         }<br>         if(!empty($_REQUEST['dir'])){<br>             $this->config['dir'] = $_REQUEST['dir'];<br>         }<br>         if(isset($_REQUEST['r'])){<br>             $this->config['r'] = $_REQUEST['r'];<br>         }<br>     }<br> <br>     // 设置<br>     public function set($key,$value=''){<br>        if(isset($this->config[$key])){<br>             $this->config[$key] = $value;<br>         }<br>     }<br> <br>     // 遍历目录下的文件并替换bom<br>     public function remove($curr_dir=''){<br>         $dir = !empty($curr_dir)?$curr_dir:$this->config['dir'];<br>         if($files = opendir($dir)) {<br>             ob_end_flush(); // 直接输出缓冲区内容<br>             while(($file = readdir($files)) !== false) {<br>                 if($file != '.' && $file != '..'){<br>                     // 是目录 递归<br>                     if(is_dir($dir.DIRECTORY_SEPARATOR.$file) && $this->config['r']==1){<br>                         $this->remove($dir.DIRECTORY_SEPARATOR.$file);<br>                     }<br>                     elseif(!is_dir($dir.DIRECTORY_SEPARATOR.$file)){<br>                         self::$total++;<br>                         if($content = $this->checkBOM($dir.DIRECTORY_SEPARATOR.$file)){<br>                             if ($this->config['auto']==1){<br>                                 $content = substr($content, 3);<br>                                 $this->rewrite($dir.DIRECTORY_SEPARATOR.$file,$content);<br>                                 echo '<span>'.$dir.DIRECTORY_SEPARATOR.$file.' 已经替换!</span><br>'.PHP_EOL;<br>                                 self::$count++;<br>                             }<br>                             else{<br>                                 echo '<span>'.$dir.DIRECTORY_SEPARATOR.$file.' 存在Bom!</span><br>'.PHP_EOL;<br>                             }<br>                         }<br>                         else{<br>                             echo $dir.DIRECTORY_SEPARATOR.$file.' 没有Bom!<br>'.PHP_EOL;<br>                         }<br>                     }<br>                 }<br>                 flush();<br>                 //sleep(1);<br>             }<br>             closedir($files);<br>         }<br>         else{<br>             echo '检查路径不存在!';<br>         }<br>     }<br> <br>     // 检查Bom<br>     public function checkBOM($filename){<br>         $content = file_get_contents($filename);<br>         if(!empty($content)){<br>             $charset[1] = substr($content, 0, 1);<br>             $charset[2] = substr($content, 1, 1);<br>             $charset[3] = substr($content, 2, 1);<br>             if (ord($charset[1])==239 && ord($charset[2])==187 && ord($charset[3])==191){<br>                 return $content;<br>             }<br>         }<br>         return false;<br>     }<br> <br>     // 重写文件<br>     public function rewrite($filename, $data){<br>         $file = fopen($filename, "w");<br>         flock($file, LOCK_EX);<br>         fwrite($file, $data);<br>         fclose($file);<br>     }<br> <br> }<br> <br> ////////////////////////////////////////////////<br> //调用<br> $bom = new Bom();<br> <br> echo  nbsp;html><br> <br> <br> <meta> <br> <meta> <br> <title></title> <br> <meta> <br> <style><br /> body,h1,div{margin:0;padding:0;font:14px/1.5 &#039;Microsoft Yahei&#039;,tahoma,arial;}<br /> .process {width:800px;height:750px;padding:20px;border:1px solid #ddd;overflow:scroll;margin-left:20px;line-height:180%;}<br /> h1{font-size:25px;text-indent:20px;margin:20px 0 10px 0;}<br /> </style> <br> <br> <br> <h1>开始检查Bom...</h1> <br> <div> <br> EOF;<br> <br> $bom->remove(); <br> <br> echo '<script>document.getElementById(\&#039;result\&#039;).innerHTML = \&#039;检测完毕!共有&#039;.Bom::$total.&#039;个文件,替换了&#039;.Bom::$count.&#039;个文件\&#039;;</script>';<br> echo  </div> <br> <br> <br> EOF;<br> $bom = null;<br> ?>从上面的类可以看出,我们在调用时,使用默认参数(当前目录、可以递归、自动移除)来运行程序,也可以设置参数来运行:

调用方法二://调用<br> $bom = new Bom();<br> $bom->set('auto',0);       //不自动替换,只检查<br> $bom->set('dir','./test');  //当前目录下的test目录<br> $bom->set('r',0);            //不递归查找子目录调用方法三:
http://你的域名/bom.php?auto=1&dir=./test/&r=1

运行效果:

PHP批量去除文件头部Bom信息

PHP批量去除文件头部Bom信息


附批量去除文件头部Bom信息文件包>>>
上传到网站任意目录下,在浏览器里访问运行即可。在运行前请先备份好站点文件,保证要替换的文件可写入。
点击下载:

附件 bom.class.zip ( 1.78 KB 下载:30 次 )

AD:真正免费,域名+虚机+企业邮箱=0元

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。