/ знакомства / игры / хостинг файлов / цитаты /

Автор Тема: Поиск и замена во всех файлах и подпапках (php)  (Прочитано 26239 раз)

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 589
    • Просмотр профиля
    • Мириад
<?php

$work_dir
="./"
// рабочая директория - обязательно должна заканчиваться
// символом "/"

$excl_dir=array();
$excl_dir[0]="./no_work_here/"
$excl_dir[1]="./and_here/and_here/";

// директории, где поиск/замена не производятся - обязательно должны заканчиваться
// символом "/"


$file_mask_1=".html"
$file_mask_2=".js";
// маски обрабатываемых файлов (будут обработаны все файлы,
// содержащие данную строку в имени)

$search_str="test"#что ищем
$replace_str="TEST"#чем заменяем

//******************************************************

$level=0;

function 
sr($dir)
{
global 
$level,$file_mask_1,$file_mask_2,$search_str,$replace_str,$excl_dir;
echo 
"";
for (
$i=0;$i<$level;$i++) echo "* * ";
echo 
$dir."";

if (@
in_array($dir,$excl_dir))
{
echo 
" - needn&#39;t search & replace
"
;
return;
}

echo 
"
"
;

$p dir($dir);
while(
$ent=$p->read()) 
{
if (
$ent!="." && $ent!=".." && !is_dir($dir $ent) && (eregi(sql_regcase($file_mask_1),$ent) || eregi(sql_regcase($file_mask_2),$ent)))
{
$tmp=@file($dir.$ent);
$str=@implode("",$tmp);

if (
strpos($str,$search_str))
{
for (
$i=0;$i<($level)+1;$i++) echo "* * ";
echo 
$dir.$ent." found...";

$str=str_replace($search_str,$replace_str,$str);

if (
$fp=@fopen($dir.$ent"w"))
{
flock($fp,LOCK_EX); 
fwrite($fp,$str);
fclose($fp);
echo 
" and replace
"
;
}
else echo 
" and can&#39;t replace
"
;
}

}
elseif(
$ent!="." and $ent!=".." and is_dir($dir $ent))
{
$level++;
sr($dir.$ent."/");
$level--;
}
}
$p->close();

return;
}

sr($work_dir);

echo 
"SEARCH & REPLACE Complete";

?>

спасено отсюда: http://scripts.xrenoder.com/sr.txt
« Последнее редактирование: 07 Января 2011, 08:39:56 от admin »

Оффлайн dobrmir

  • Newbie
  • *
  • Сообщений: 2
    • Просмотр профиля
Здравствуйте. Попробывал вот такой код в скрипт вставить
$patterns = array('\A.+\(54\)');  // то чего менять
$replace = array('');     //  то на что менять
$file = preg_replace($patterns,$replace,$file);

Это удалил:
$search_str="test"; #что ищем
$replace_str="TEST"; #чем заменяем

Выдает в браузер такие сообщения и не работает:
Warning: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash in Z:\home\1netbeans\www\PhpProject1\index.php on line 25
./
Deprecated: Function sql_regcase() is deprecated in Z:\home\1netbeans\www\PhpProject1\index.php on line 51

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 589
    • Просмотр профиля
    • Мириад
Вообще, код старый и не мой. Был добавлен для тех, кто ищёт именно его, т.к. был в своё время популярен.

$patterns = array('/\A.+\(54\)/');  // то чего менять
$replace = array('');     //  то на что менять
$file = preg_replace($patterns,$replace,$file);
попробуй так. Для pcre нужно выражения ограничивать с двух сторон


Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 589
    • Просмотр профиля
    • Мириад
Этот вроде посовременней: http://www.php.su/articles/?cat=examples&page=055

Если есть доступ к шеллу, то ещё лучше

find -type f -name \*.py -exec sed -i -r 's/regexp1/regexp2/g' {} \;
Заменит во всех файлах *.py начиная от текущей директории строку regexp1 на regexp2. (можно использовать regexp выражения)
http://habrahabr.ru/qa/5396/

Оффлайн dobrmir

  • Newbie
  • *
  • Сообщений: 2
    • Просмотр профиля
Большое спасибо