小站在一次使用介面傳輸的過程遇到bom檔案,使得接收過來的資料無法使用,在網上找到php版的去除bom檔案,但是沒有檢測子檔案夾功能和排除不需要檢測的檔案夾,於是在此基礎上用物件導向的方式做了些修改。
<?php
/**
* 此檔案用於快速測試UTF8編碼的檔案是不是加了BOM,並可自動移除
* 增加了檢測子檔案夾和排除不要檢測的檔案夾
*
* @author yangzy
*/
$bom = new bom();
$bom->run();
class bom
{
public $basedir = "./../trunk_bugfix";//修改此行為需要檢測的目錄,點表示目前的目錄
public $auto = '1';//是否自動移除發現的BOM資訊。1為是,0為否。
public $file_arr = array('.svn');//不需要檢測檔案夾
public function __construct()
{
}
/**
* 運行程式
*/
public function run($basedir = '')
{
$basedir || $basedir = $this->basedir;
if ($dh = opendir($basedir)) {
while (($file = readdir($dh)) !== false) {
if ($file!='.' && $file!='..' && !is_dir($basedir."/".$file))
{
echo $basedir."/".$file.':'.$this->checkBOM($basedir."/$file")." <br>";
}
elseif ($file!='.' && !in_array($file, $this->file_arr) && $file!='..' && is_dir($basedir."/".$file))
{
$this->run($basedir."/".$file);
}
}
closedir($dh);
}
}
/**
* 檢測bom檔案
*/
public function checkBOM($filename)
{
$contents=file_get_contents($filename);
$charset[1]=substr($contents, 0, 1);
$charset[2]=substr($contents, 1, 1);
$charset[3]=substr($contents, 2, 1);
if (ord($charset[1])==239 && ord($charset[2])==187 && ord($charset[3])==191) {
if ($this->auto == 1) {
$rest=substr($contents, 3);
$this->rewrite ($filename, $rest);
return ("<font color=red>BOM found, automatically removed.</font>");
} else {
return ("<font color=red>BOM found.</font>");
}
}
else return ("BOM Not Found.");
}
/**
* 重建檔案
*/
public function rewrite($filename, $data)
{
$filenum=fopen($filename,"w");
flock($filenum,LOCK_EX);
fwrite($filenum,$data);
fclose($filenum);
}
}
轉自:http://www.ibihuo.com/show-59.html