Форумы портала PHP.SU » Разное » Обсуждение статей » Замена строки во всех файлах директории с неограниченным числом вложенных поддиректорий

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

1. idimka - 06 Июня, 2007 - 01:41:13 - перейти к сообщению
Ребят, я новичок, поэтому такие вопросы:
В статье даны 2 кода.
Как код вызова функции scan_dir(), вызывает эту самую функцию?
Вернее я вообще не понимаю как связаны эти 2 кода. И в общем, у меня ничего не получилось... Не получилось произвести замену в файлах директории.
Я из 2 кода взял эти строчки
PHP:
скопировать код в буфер обмена
  1.  
  2. $text = '$text'; // Искомая строка
  3. $retext = '$retext'; // Строка замены
  4. $dirname = "Имя корневой директории, например .";
  5.  


и скопировал в первый код, заменив конечно $text и $retext на нужные мне словосочетания. $dirname превратил в

И у меня ничего не получилось. Никакой ошибки не было.
2. evgenijj - 06 Июня, 2007 - 08:47:28 - перейти к сообщению
Во-первых, скрипт содержит ошибку: надо заменить строку
PHP:
скопировать код в буфер обмена
  1.  
  2.     // Перезаписываем файл
  3.  

на
PHP:
скопировать код в буфер обмена
  1.  
  2.     // Перезаписываем файл
  3.     file_put_contents($dirname."/".$file, $content);
  4.  

Во-вторых, указывать в качестве $dirname текущую директорию - дурная идея, т.к. сам скрипт содержит строку, которую надо заменить. Соответственно, файл скрипта будет перезаписан.

В-третьих, для того, чтобы PHP показывал ошибки, выстави в php.ini
display_errors = On
error_reporting = E_ALL

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4.   $text = 'Что заменяем'; // Искомая строка
  5.   $retext = 'На что заменяем'; // Строка замены
  6.   $dirname = "./temp";
  7.   scan_dir($dirname);  // Вызов рекурсивной функции
  8.  
  9.   //////////////////////////////////////////////////////////
  10.   // Рекурсивная функция - спускаемся вниз по каталогу
  11.   //////////////////////////////////////////////////////////
  12.  
  13.   function scan_dir($dirname)
  14.   {
  15.     // Объявляем переменные замены глобальными
  16.     GLOBAL $text, $retext;
  17.     // Открываем текущую директорию
  18.     $dir = opendir($dirname);
  19.     // Читаем в цикле директорию
  20.     while (($file = readdir($dir)) !== false)
  21.     {
  22.       // Если файл обрабатываем его содержимое
  23.       if($file != "." && $file != "..")
  24.       {
  25.         // Если имеем дело с файлом - производим в нём замену
  26.         if(is_file($dirname."/".$file))
  27.         {
  28.           // Читаем содержимое файла
  29.           $content = file_get_contents($dirname."/".$file);
  30.           // Осуществляем замену
  31.           $content = str_replace($text, $retext, $content);
  32.           // Перезаписываем файл
  33.           file_put_contents($dirname."/".$file, $content);
  34.         }
  35.         // Если перед нами директория, вызываем рекурсивно
  36.         // функцию scan_dir
  37.         if(is_dir($dirname."/".$file))
  38.         {
  39.           echo $dirname."/".$file."<br/>";
  40.           scan_dir($dirname."/".$file);
  41.         }
  42.       }
  43.     }
  44.     // Закрываем директорию
  45.     closedir($dir);
  46.   }
  47.  
  48. ?>
  49.  
3. idimka - 06 Июня, 2007 - 12:18:55 - перейти к сообщению
Выдает ошибку:
Fatal error: Call to undefined function: file_put_contents() in z:/home/test1.ru/www/g/zamena.php on line 32

В строке 32 находится эта строчка:


Попробовал с этой
PHP:
скопировать код в буфер обмена

тоже ошибка.

В php.ini у меня все стояло как надо. И действительно было глупым делать замену в текущей директории. Спасибо.

И почему блин, я ставлю на этом форуме тег [code], а он не работает? Что-то у меня все через ж...

И что за интересная функция file_put_contents ()? Искал в справочнике, не нашел.
Подумал, что может ошибка и надо писать file_get_contents (), но тогда вообще ничего не произошло. Да и точно это не file_get_contents ()... Здесь во второй раз она не к месту вроде...
4. evgenijj - 06 Июня, 2007 - 12:36:27 - перейти к сообщению
Функции file_put_contents() и file_get_contents() доступны в PHP 4 >= 4.3.0, PHP 5. По видимому, у тебя более старая версия.

Тег [code] на этом форуме не работает - используй [php]
5. idimka - 06 Июня, 2007 - 12:56:32 - перейти к сообщению
Что странно, но у меня PHP Version 4.4.4
Попробую обновить. И посмотреть результат.
6. evgenijj - 06 Июня, 2007 - 13:49:38 - перейти к сообщению
idimka пишет:
Что странно, но у меня PHP Version 4.4.4
Попробую обновить. И посмотреть результат.

Судя по строке
z:/home/test1.ru/www/g/zamena.php
у тебя стоит "Джентльменский набор Web-разработчика" http://www[dot]denwer[dot]ru/ Возможно, там урезанная версия PHP, которая не поддерживает некоторые функции. Но это только предположение...
7. idimka - 06 Июня, 2007 - 16:02:21 - перейти к сообщению
Да, у меня стоит джентельменский набор. Урезана php вряд ли... А могут настройки php.ini влиять на не срабатывание функции file_put_contents()?
8. evgenijj - 06 Июня, 2007 - 16:07:06 - перейти к сообщению
idimka пишет:
Урезанная php вряд ли...

Ты общался с Котеровым? Он тебе это лично сказал?
9. idimka - 07 Июня, 2007 - 03:23:57 - перейти к сообщению
Оказалось у меня полсеняя версия этого денвера, так что спрошу на их форуме.
10. evgenijj - 07 Июня, 2007 - 08:51:43 - перейти к сообщению
idimka пишет:
Оказалось у меня посленяя версия этого денвера, так что спрошу на их форуме.

Посмотрел сегодня на php.net
file_get_contents() доступна для PHP 4 >= 4.3.0, PHP 5
file_put_contents() доступна для PHP 5
Я почему-то думал, что эти функции появились в PHP одновременно. Так что первое предположение было верным - просто у тебя старая версия PHP.

P.S. Кстати, Денвер позволяет устанавливать пакеты расширений, в том числе и PHP5 http://www[dot]denwer[dot]ru/packages/php5[dot]html Только PHP5 ставится в виде внешней CGI-программы, а не в виде модуля Apache, как PHP4.
Кроме того, есть разновидность базового пакета Денвера — Base_PHP5. Дистрибутив содержит: Apache, PHP5, Perl, MySQL, phpMyAdmin, sendmail-заглушка, однако в нем нет PHP версии 4; вместо него — PHP5. Достоинство данного дистрибутива в том, что PHP5 работает в виде модуля Apache, а не в виде CGI-обработчика: http://www[dot]denwer[dot]ru/packages/base_php5[dot]html
11. idimka - 07 Июня, 2007 - 15:10:54 - перейти к сообщению
Спасибо большое. Сменил денвер, все заработало.
Я ошибался, что у меня последняя версия. Просто начал качать ту версию, которая на главной странице, оказалась та же, что и у меня.
На их форуме мне тоже сказали, что file_put_contents() доступна в PHP 5.
Я блин ступил, не посмотрел. А скорее поленился...
12. Acuna - 27 Сентября, 2008 - 21:53:21 - перейти к сообщению
Помогите! Я этот код использовал, но только вместо
PHP:
скопировать код в буфер обмена
  1.           // Читаем содержимое файла
  2.           $content = file_get_contents($dirname."/".$file);
  3.           // Осуществляем замену
  4.           $content = str_replace($text, $retext, $content);
  5.           // Перезаписываем файл
  6.           file_put_contents($dirname."/".$file, $content);
пытался использовать
PHP:
скопировать код в буфер обмена
  1. copy ($dirname."/".$file, $dirname2."/".$file);
Т. е. я пытался переместить все файлы из папки temp в папку $dirname2. Но это почему-то не работает! Heeelp!
13. Champion - 28 Сентября, 2008 - 07:56:25 - перейти к сообщению
Функция copy копирует файл. Для переместить надо пользоваться функцией rename
(Добавление)
Кроме этого в примере выше рекурсивно обходятся и все вложенные папки. У вас тогда в том каталоге, в которые перемщаете иерархия потеряется. Мне так кажется
(Добавление)
И вообще, если Вам надо переместить, то, насолько мне кажется, функция rename перемещает и каталоги. И не обязательно залазить внутрь них
14. Elvis - 16 Декабря, 2009 - 14:25:16 - перейти к сообщению
Ребята вот так проще менять фразы или что хочешь

sed -i 's/pattern_OLD/pattern_NEW/g' templates/*.php

и все ))) или басш скрипт написать
15. EuGen - 18 Декабря, 2009 - 11:08:53 - перейти к сообщению
Предупреждение за поднятие старой темы

 

Powered by ExBB FM 1.0 RC1