Удаление из UTF8 BOM php-скриптом

Удаление из UTF8 BOM php-скриптом

Столкнулся с интересной ошибкой, страница панели управления сайта на CMS MODX стала время от времени отображаться некорректно, вместо страницы на все окно браузера растягивалось меню панели управления MODX.

Долго не мог найти причину ошибки, в консоли браузера не показывалось никаких ошибок, а верстка рушилась, после обновления страница могла корректно отобразиться, то есть ошибка повторялась не постоянно.

Потратив несколько часов на проверку и случайно заметил, что в панели разработчика (f12) в коде страницы в самом её начале выделяется пустой символ, при выборе «Edit as HTML» пустой символ превращался в



Оказалось, причина в кодировке файлов, часть файлов по какой-то причине были в UTF8 c BOM, в основном это были файлы дополнения poll, оно реализует функции голосования для MODX.

Для массовой чистки от BOM воспользовался php скриптом:

<?
$HOME = dirname(__FILE__); // Указываем папку с которой начать рекурсивный поиск
$WIN = 0; //Если север на windows, то указать 1

// Рекурсивный поиск
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;
                    // Удаляет 3 символа из начала файла
                    $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;
}

?>
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <title>Поиск и удаление UTF8 BOM</title>
</head>
<body>
<div class="FOUND">
    <?
    $BOMBED = array();
    RecursiveFolder($HOME);
    $list = '';
    foreach ($BOMBED as $utf) {
        $list .= $utf . "<br />\n";
    }
    if (!empty($list)) {
        ?>
        <h2>BOM был найден в:</h2>
        <?= $list; ?>
    <? } else { ?>
        <h2>BOM не найден</h2>
    <? } ?>
</div>
</body>
</html>

Достаточно загрузить файл с эти скриптом в корневую директорию и запустить его.

Комментарии ()

Вы можете авторизоваться на сайте через:
YandexVkontakte
  1. Артем 29 июня 2017, 16:06 # 0
    После чистки сайта от вируса его верстка расползалась, прошелся этим скриптом и офигел, почти 1000 файлов с BOM меткой. Вся верстка теперь на месте. Кто бы мог подумать, что все проблемы из-за одного символа. Спасибо!