您的位置:

包含php检查bom头信息的词条

本文目录一览:

如何使用PHP批量去除文件UTF8 BOM信息

原理:

UTF8文件,微软为了增加一个识别信息,有了BOM这个东西:BOM —— Byte Order Mark,缺省在Windows等平台上编辑的UTF8文件会在头部增加3个字节的标记信息,我们PHP引擎在处理的时候会完整读取整个PHP代码文档, 如果PHP文件头部包含BOM信息,就会输出一个空白,在很多时候会带来问题,比如我们session无法工作、cookie无法设置等等问题。

解决方法:

把头部BOM的3个字节信息识别出来,然后剔除掉。不过一般情况我们不知道哪个文件有BOM,或者是有很多文件,这个时候,就需要进行批量处理了,下面代码主要就是展现了批量处理的情况,应该会对大家工作中有帮助。

执行方法:

设置一个路径,然后直接执行就行。

复制代码 代码如下:

?php

// 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)

$HOME = dirname(__FILE__);

// 如果是Windows系统,修改为:$WIN = 1;

$WIN = 0;

?

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""

html xmlns=""

head

meta http-equiv="Content-Type" content="text/html; charset=utf-8" /

titleUTF8 BOM 清除器/title

style

body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }

.FOUND { color: #F30; font-size: 14px; font-weight: bold; }

/style

/head

body

?php

$BOMBED = array();

RecursiveFolder($HOME);

echo 'h2These files had UTF8 BOM, but i cleaned them:/h2p class="FOUND"';

foreach ($BOMBED as $utf) { echo $utf ."br /n"; }

echo '/p';

// 递归扫描

function RecursiveFolder($sHOME) {

global $BOMBED, $WIN;

$win32 = ($WIN == 1) ? "" : "/";

$folder = dir($sHOME);

$foundfolders = array();

while ($file = $folder-read()) {

if($file != "." and $file != "..") {

if(filetype($sHOME . $win32 . $file) == "dir"){

$foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;

} else {

$content = file_get_contents($sHOME . $win32 . $file);

$BOM = SearchBOM($content);

if ($BOM) {

$BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;

// 移出BOM信息

$content = substr($content,3);

// 写回到原始文件

file_put_contents($sHOME . $win32 . $file, $content);

}

}

}

}

$folder-close();

if(count($foundfolders) 0) {

foreach ($foundfolders as $folder) {

RecursiveFolder($folder, $win32);

}

}

}

// 搜索当前文件是否有BOM

function SearchBOM($string) {

if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;

return false;

}

?

/body

/html

望采纳。

PHP批量删除、清除UTF-8文件BOM头的代码实例

记得运行代码前先把文件备份一下哦,避免出现失败问题。

代码一:

复制代码

代码如下:

function

checkBOM

($filename)

{

global

$auto;

$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

($auto

==

1)

{

$rest

=

substr($contents,

3);

rewrite

($filename,

$rest);

return

("font

color=redBOM

found,

automatically

removed./font");

}

else

{

return

("font

color=redBOM

found./font");

}

}

else

return

("BOM

Not

Found.");

}

代码二:

复制代码

代码如下:

?php

header('content-Type:

text/html;

charset=utf-8');

if(isset($_GET['dir'])){

//设置文件目录,如果没有设置,则自动设置为当前文件所在目录

$basedir=$_GET['dir'];

}else{

$basedir='.';

}

$auto=1;/*设置为1标示检测BOM并去除,设置为0标示只进行BOM检测,不去除*/

echo

'当前查找的目录为:'.$basedir.'当前的设置是:';

echo

$auto?'检测文件BOM同时去除检测到BOM文件的BOMbr

/':'只检测文件BOM不执行去除BOM操作br

/';

checkdir($basedir);

function

checkdir($basedir){

if($dh=opendir($basedir)){

while

(($file=readdir($dh))

!==

false){

if($file

!=

'.'

$file

!=

'..'){

if(!is_dir($basedir.'/'.$file)){

echo

'文件:

'.$basedir.'/'.$file

.checkBOM($basedir.'/'.$file).'

br';

}else{

$dirname=$basedir.'/'.$file;

checkdir($dirname);

}

}

}

closedir($dh);

}

}

function

checkBOM($filename){

global

$auto;

$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($auto==1){

$rest=substr($contents,3);

rewrite($filename,$rest);

return

('

font

color=red找到BOM并已自动去除/font');

}else{

return

('

font

color=red找到BOM/font');

}

}else{

return

('

没有找到BOM');

}

}

function

rewrite($filename,$data){

$filenum=fopen($filename,'w');

flock($filenum,LOCK_EX);

fwrite($filenum,$data);

fclose($filenum);

}

?

php检测文件是否有bom头代码

?php

/*检测并清除BOM*/

if(isset($_GET['dir'])){

    $basedir=$_GET['dir'];

}else{

    $basedir = '.';

}

$auto = 1;

checkdir($basedir);

function checkdir($basedir){

    if($dh = opendir($basedir)){

        while(($file = readdir($dh)) !== false){

            if($file != '.'  $file != '..'){

                if(!is_dir($basedir."/".$file)){

                    echo "filename: $basedir/$file ".checkBOM("$basedir/$file")." ";

                }else{

                    $dirname = $basedir."/".$file;

                    checkdir($dirname);

                }

            }

        }//end while

    closedir($dh);

    }//end if($dh

}//end function

function checkBOM($filename){

    global $auto;

    $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($auto == 1){

            $rest = substr($contents, 3);

            rewrite ($filename, $rest);

            return "font color=redBOM found, automatically removed./font";

        }else{

            return ("font color=redBOM found./font");

        }

    }

    else return ("BOM Not Found.");

}//end function

function rewrite($filename, $data){

    $filenum = fopen($filename, "w");

    flock($filenum, LOCK_EX);

    fwrite($filenum, $data);

    fclose($filenum);

}//end function

?

检测文件是否有bom头

方法一:用Ultraedit或Editplus打开PHP文件,另存为无Bom的utf-8文件方法二:用Dreamweaver去除Bom头

菜单–修改–页面属性 或者ctrl+j打开页面属性窗口,点选“标题/编码”去掉“包括Unicode签名Bom”前的勾

有Bom的文件太多?这样太麻烦?当然有更好的方法!方法三:用php文件批量去除bom头 将以下这段代码保存为php文件,上传到服务器,用浏览器访问它!?phpif (isset($_GET['dir'])){ //设置文件目录

$basedir=$_GET['dir'];}else{$basedir = '.';}$auto = 1;checkdir($basedir);

function checkdir($basedir){

if ($dh = opendir($basedir)) {

while (($file = readdir($dh)) !== false) {

if ($file != '.' $file != '..'){

if (!is_dir($basedir./.$file)) {

echo filename: $basedir/$file .checkBOM($basedir/$file). ;}else{$dirname = $basedir./.$file;

checkdir($dirname);}}}closedir($dh);}}function checkBOM ($filename) {

global $auto;

$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 ($auto == 1) {

$rest = substr($contents, 3);

rewrite ($filename, $rest);

return (font color=redBOM found, automatically removed./font);} else {return (font color=redBOM found./font);}}else return (BOM Not Found.);}function rewrite ($filename, $data) {

$filenum = fopen($filename, w);

flock($filenum, LOCK_EX);

fclose($filenum);}?还用记事本保存?那你真是智商捉急了!