檢查php文件中是否含有bom的php文件

本文详细介绍了在使用Windows自带的记事本等软件保存以UTF-8编码的文件时,文件开始处会插入不可见字符BOM的问题。BOM的存在会导致PHP读取、包含或引用这些文件时出现错误,如无法紧贴浏览器顶部显示和COOKIE送出功能失效。文章提供了解决方案,包括检测和清除BOM的PHP代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接: http://www.cnblogs.com/Athrun/archive/2010/05/27/1745464.html

另一篇文章:《关于bom.php》,http://hi.baidu.com/aullik5/blog/item/f0e589127a28a2f0f7039e5e.html

另一篇文章:《[BOM]PHP程序的UTF8神秘编码问题之解》,http://www.mlecms.com/tech/56.html

  类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于 PHP来说,BOM是个大麻烦。

  PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个字符呢!

  最大的麻烦还不是这个。受COOKIE送出机制的限制,在这些文件开头已经有BOM的文件中,COOKIE无法送出(因为在COOKIE送出前PHP已经送出了文件头),所以登入和登出功能失效。一切依赖COOKIE、SESSION实现的功能全部无效。
<?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")." <br>";  
                }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=red>BOM found, automatically removed.</font>";  
        }else{  
            return ("<font color=red>BOM 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  
?>


### 无头浏览器的使用方法与实现技术 #### 使用方法 无头浏览器可以通过多种编程库和框架进行配置和操作。常见的工具有 Puppeteer 和 Playwright,这些工具提供了高级 API 来控制主流浏览器Chrome/Chromium、Firefox 和 WebKit 的实例[^1]。开发者可以利用这些工具创建脚本,在后台运行自动化任务。 以下是基于 Node.js 平台的一个简单示例,展示如何使用 Puppeteer 启动一个无头浏览器并抓取网页内容: ```javascript const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); // 默认启动无头模式 const page = await browser.newPage(); await page.goto('https://example.com'); const content = await page.content(); // 获取整个 HTML 页面的内容 console.log(content); await browser.close(); })(); ``` 此代码片段展示了如何加载目标网站,并提取其完整的 HTML 结构[^1]。 对于 Python 用户来说,Playwright 是一种强大的替代方案。下面是一个简单的例子,演示了如何用 Python 控制无头浏览器访问特定 URL 并截屏保存图像文件: ```python from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) # 设置 headless 参数为 True 表明启用无头模式 page = browser.new_page() page.goto("http://whatsmyuseragent.org/") page.screenshot(path="screenshot.png") # 截图功能 browser.close() ``` 这段代码说明了通过 Playwright 库轻松完成截图的功能[^1]。 #### 实现技术 无头浏览器的核心原理在于模拟真实用户的浏览行为,但在不显示任何 GUI 的前提下工作。具体而言,这类软件会在内存中渲染页面并将最终结果返回给调用者而不是呈现到显示器上[^2]。这种机制允许开发人员专注于数据获取或者功能性验证而不必关心视觉效果。 例如 QtWebKit 提供了一个名为 QWebEngineView 的组件用于常规有界窗口中的 web 显示;然而当需要构建无头版本时,则会采用另一种途径——即直接依赖于底层引擎处理所有的 DOM 解析以及 CSS 渲染等工作流程,只是省去了最后一步即将画面绘制至屏幕上的过程[^2]。 因此无论是哪种具体的实现形式,都离不开以下几个关键技术点: - **DOM 解析**: 将接收到的 HTML 文档转换成内部结构表示以便进一步分析。 - **CSS 渲染**: 计算样式规则应用后的布局信息。 - **JavaScript 执行环境**: 支持动态生成内容所需的 JS 脚本解析器及解释器。 以上就是关于无头浏览器的一些基本概念及其实际运用的例子介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值