<?php
header("Content-type:text/html;charset=utf-8");
// 默认是当前目录
$basedir = '.';
// 是否自动去掉 BOM 头,默认不去除(0表示不去1表示去)
$auto = 0;
/*
 * 函数名:checkDir
 * 说明:检查目录及文件是否包含BOM头
 */
function checkDir($basedir){
	// opendir函数获取打开目录句柄 
	if($dh = opendir($basedir)) {
		// readdir函数返回目录中下一个文件的文件名
		while(($file = readdir($dh)) !== false) { 
			if($file != '.' && $file != '..') {
				// is_dir函数检查指定的文件是否是目录 
				if(!is_dir($basedir."/".$file)) {
					// 调用检查文件内容是否包含BOM的函数 
					echo "文件名 $basedir/$file ".checkBOM("$basedir/$file")." <br>"; 
				}else {
					$dirname = $basedir."/".$file;
					// 递归调用
					checkDir($dirname); 
				} 
			} 
		}
		// 关闭目录句柄
		closedir($dh); 
	} 
}
/*
 * 函数名:checkBOM
 * 说明:检查文件内容是否包含BOM
 */
function checkBOM($filename) { 
	global $auto;
	// file_get_contents() 函数把整个文件读入一个字符串中
	$contents = file_get_contents($filename); 
	$charset[1] = substr($contents, 0, 1); 
	$charset[2] = substr($contents, 1, 1); 
	$charset[3] = substr($contents, 2, 1);
	// ord函数返回字符串的首个字符的 ASCII 值
	if(ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) { 
		if($auto == 1) {
			// substr() 函数返回字符串的一部分,截图除了前三个字符的其他内容
			$rest = substr($contents, 3);
			// 调用重写文件函数 
			rewrite ($filename, $rest); 
			return "BOM 找到, 自动删除"; 
		} else { 
			return "找到BOM"; 
		} 
	}else{
		return "BOM 没有找到";
	}
}
/*
 * 函数名:rewrite
 * 说明:向指定文件写指定的内容
 */
function rewrite($filename, $data){
	// fopen() 函数打开文件或者URL,"w"表示写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建
	$file = fopen($filename, "w");
	// flock() 函数锁定或释放文件,"LOCK_EX"表示要取得独占锁定(写入的程序)
	flock($file, LOCK_EX);
	// fwrite() 函数写入文件 
	fwrite($file, $data);
	// fclose() 函数关闭一个打开文件 
	fclose($file); 
}
// 调用检查目录及文件是否包含BOM头函数
checkDir($basedir);
