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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Удаление метки BOM из php

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: PHP
vlom
Отправлено: 09 Января, 2011 - 22:37:56
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 681
Дата рег-ции: Окт. 2010  
Откуда: Екатеринбург


Помог: 4 раз(а)




вчера потребовалась удалить бум сразу из множество файлов, в ручную их перелопачивать
было лень, вот наваял скриптик
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 файлов
 
 Top
RomAndry Администратор
Отправлено: 10 Января, 2011 - 08:09:06
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 913
Дата рег-ции: Янв. 2008  


Помог: 6 раз(а)




Спасибо. Полезная вещь!
У самого руки никак не доходят =)
 
My status
 Top
Champion Супермодератор
Отправлено: 10 Января, 2011 - 08:41:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




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, а через рекурсвное чтение директорий.
 
 Top
vlom
Отправлено: 10 Января, 2011 - 09:09:38
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 681
Дата рег-ции: Окт. 2010  
Откуда: Екатеринбург


Помог: 4 раз(а)




Champion пишет:
Если работает, то нормально) Хотя я бы делал не через glob, а через рекурсвное чтение директорий.


с рекурсией плохо, то ли лыжи не катят, то ли я... в таком духе, долго пытался написать
реукрсию но ни чего хорошего не вышло, может кто поможет с ней разобраться
 
 Top
Champion Супермодератор
Отправлено: 10 Января, 2011 - 09:28:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Читаешь папку. В ней есть другие файлы и папки.
Папки . и .. пропускаешь.
Имя файла добавляешь в итоговый массив.
Для директории вызываешь эту же функцию рекурсивно.

В функцию передаешь либо пусть, а открытие-закрытие директории делаешь внутри, либо передаешь дескриптор, а открытие-закрытие снаружи. Лучше первое.
 
 Top
Ch_chov
Отправлено: 10 Января, 2011 - 12:16:49
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Гугл подсказал такую функцию
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
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Пользовательские функции »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB