Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Удаление метки BOM из php
Форумы портала PHP.SU » PHP » Пользовательские функции » Удаление метки BOM из php

Страниц (1): [1]
 

1. vlom - 09 Января, 2011 - 22:37:56 - перейти к сообщению
вчера потребовалась удалить бум сразу из множество файлов, в ручную их перелопачивать
было лень, вот наваял скриптик
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function searchFile($path, $pattern = '*', $flags = 0, $depth = 0) {
  3.     $matches = array();
  4.     $folders = array(rtrim($path, DIRECTORY_SEPARATOR));
  5.  
  6.     while($folder = array_shift($folders)) {
  7.         $matches = array_merge($matches, glob($folder.DIRECTORY_SEPARATOR.$pattern, $flags));
  8.         if($depth != 0) {
  9.             $moreFolders = glob($folder.DIRECTORY_SEPARATOR.'*', GLOB_ONLYDIR);
  10.             $depth   = ($depth < -1) ? -1: $depth + count($moreFolders) - 2;
  11.             $folders = array_merge($folders, $moreFolders);
  12.         }
  13.     }
  14.     return $matches;
  15. }
  16.  
  17. $f = searchFile(dirname(__FILE__), "*.php", 0, 10000);
  18.  
  19. foreach ($f as $key => $val) {
  20.     $f = fopen($val,'rb');
  21.     $t = fread($f, filesize($val));
  22.    
  23.     if (preg_match('|\xEF\xBB\xBF|', $t) !== 0) {
  24.         if (is_writable($val) === true) {
  25.             $data = preg_replace('|\xEF\xBB\xBF|', "", $t);
  26.             $file = fopen($val,'w+b');
  27.             if (fwrite($file, $data) === FALSE) {
  28.                 echo "$file :: Не могу произвести изменение";
  29.             }
  30.             echo "$val :: Успешно отредактирован";
  31.             fclose($file);
  32.         }
  33.         else{
  34.             echo $val." :: Присутствует метка BOM, файл доступен только для чтения<br />";
  35.         }
  36.     }
  37. }
  38. ?>


строго не судите, покажите что можно улучшить))))
(Добавление)
Особенно волнует меня первая часть скрипта, поиск php файлов
2. RomAndry - 10 Января, 2011 - 08:09:06 - перейти к сообщению
Спасибо. Полезная вещь!
У самого руки никак не доходят =)
3. Champion - 10 Января, 2011 - 08:41:25 - перейти к сообщению
vlom пишет:
if (preg_match('|\xEF\xBB\xBF|', $t)

strpos($t, "\xEF\xBB\xBF") === 0). Зачем тут регулярка? И символ этот нужен именно в начале файла.

preg_replace можно заменить на str_replace.
И preg_match + preg_replace можно заменить на один preg_replace
vlom пишет:
Особенно волнует меня первая часть скрипта, поиск php файлов
Если работает, то нормально) Хотя я бы делал не через glob, а через рекурсвное чтение директорий.
4. vlom - 10 Января, 2011 - 09:09:38 - перейти к сообщению
Champion пишет:
Если работает, то нормально) Хотя я бы делал не через glob, а через рекурсвное чтение директорий.


с рекурсией плохо, то ли лыжи не катят, то ли я... в таком духе, долго пытался написать
реукрсию но ни чего хорошего не вышло, может кто поможет с ней разобраться
5. Champion - 10 Января, 2011 - 09:28:10 - перейти к сообщению
Читаешь папку. В ней есть другие файлы и папки.
Папки . и .. пропускаешь.
Имя файла добавляешь в итоговый массив.
Для директории вызываешь эту же функцию рекурсивно.

В функцию передаешь либо пусть, а открытие-закрытие директории делаешь внутри, либо передаешь дескриптор, а открытие-закрытие снаружи. Лучше первое.
6. Ch_chov - 10 Января, 2011 - 12:16:49 - перейти к сообщению
Гугл подсказал такую функцию
PHP:
скопировать код в буфер обмена
  1. function removeBOM($str=""){
  2.   if(substr($str, 0, 3) == pack('CCC', 0xef, 0xbb, 0xbf))
  3.     $str = substr($str, 3);
  4.   return $str;
  5. }

остается только прикрутить рекурсивную обработку директорий.

Для линукса можно обойтись без php, используя только утилиты коммандной строки.
http://ubuntu-ky[dot]ubuntuforums[dot]or[dot][dot][dot]&postcount=3

 

Powered by ExBB FM 1.0 RC1