我有一个带有多个文件的PHP应用程序。问题是一个或几个文件显然有一个BOM,因此包含它们会在创建会话时导致错误...有没有办法如何重新配置PHP或服务器或如何摆脱BOM?或者至少确定来源?如果可以的话,我更喜欢PHP解决方案
答案 0 :(得分:1)
当然,真正的解决方案是修改您的编辑器设置(以及其他团队成员),以便不存储具有UTF字节顺序标记的文件。请继续阅读:https://stackoverflow.com/a/2558793/43959
您可以使用此功能在包含其他PHP文件之前“透明地”删除BOM。
注意:我真的建议您修改您的编辑器/文件,而不是使用我在此处演示的eval()
进行令人讨厌的事情。
这只是一个概念证明:
bom_test.php:
<?php
function bom_safe_include($file) {
$fd = fopen($file, "r");
// read 3 bytes to detect BOM. file read pointer is now behind BOM
$possible_bom = fread($fd, 3);
// if the file has no BOM, reset pointer to beginning file (0)
if ($possible_bom !== "\xEF\xBB\xBF") {
fseek($fd, 0);
}
$content = stream_get_contents($fd);
fclose($fd);
// execute (partial) script (without BOM) using eval
eval ("?>$content");
// export global vars
$GLOBALS += get_defined_vars();
}
// include a file
bom_safe_include("test_include.php");
// test function and variable from include
test_function($test);
test_include.php, BOM开头
test
<?php
$test = "Hello World!";
function test_function ($text) {
echo $text, PHP_EOL;
}
输出:
kaii@test$ php bom_test.php
test
Hello World!
答案 1 :(得分:0)
我已经能够使用此脚本识别其中包含BOM的文件,这可能会帮助其他人在将来遇到同样的问题。没有eval()
的工作。
function fopen_utf8 ($filename) {
$file = @fopen($filename, "r");
$bom = fread($file, 3);
if ($bom != b"\xEF\xBB\xBF")
{
return false;
}
else
{
return true;
}
}
function file_array($path, $exclude = ".|..|libraries", $recursive = true) {
$path = rtrim($path, "/") . "/";
$folder_handle = opendir($path);
$exclude_array = explode("|", $exclude);
$result = array();
while(false !== ($filename = readdir($folder_handle))) {
if(!in_array(strtolower($filename), $exclude_array)) {
if(is_dir($path . $filename . "/")) {
// Need to include full "path" or it's an infinite loop
if($recursive) $result[] = file_array($path . $filename . "/", $exclude, true);
} else {
if ( fopen_utf8($path . $filename) )
{
//$result[] = $filename;
echo ($path . $filename . "<br>");
}
}
}
}
return $result;
}
$files = file_array(".");
答案 2 :(得分:-1)
vim $(find . -name \*.php)
一旦进入vim:
:argdo :set nobomb | :w