Размещено: 2023-12-08 18:11:52

Теги: php

ПОИСК ПО ФАЙЛАМ И ЗАМЕНА

Поиск, замена содержимого по файловой системе на сервере с помощью php можно выполнить следующим образом:

//автоматическая замена текста во всех файлах или поиск текста в файлах

function text_search($path,$text,$new_text)
{
    foreach(glob($path) as $dir)
    {
        if(is_dir($dir))
        {
            text_search($dir.'/*',$text,$new_text);
        }
        elseif($dir=='../main/replace.php'){}//это наш текущий файл, в нем ничего не меняем
        else
        {
            unset($content);
            $content=file_get_contents($dir);
            if(strpos($content, $text)!==false)
            {
                unset($new_content);
                $new_content=str_replace($text,$new_text,$content);

                //Если строки ниже закомментированы то просто выполняем поиск, без замены
                //$new_content=str_replace($text,$new_text,$content);
                //file_put_contents($dir,$new_content);

                echo $dir.'<br>';
                //echo $new_content;
                //exit;
            }
        }
    }
}


$text='text';
$new_text='newtext';

//путь относительно расположения текущего файла, текст поиска, текст замены
text_search('../*',$text,$new_text);

Есть так же продвинутый вариант:

function scan($path)
{
    foreach(glob($path) as $dir)
    {
        if(is_dir($dir))
        {
            scan($dir.'/*');
        }

        //это наш текущий файл, в нем ничего не меняем, впринципе можно эту строку убрать, 
        //тогда появляется бонус - два раза замена не произойдет
        elseif($dir==CONST_ETOT_FILE){}
        else
        {
            search_and_replace($dir);
        }
    }
}


function search_and_replace($dir)
{
    //проверяем расширение файла, если оно не соответствует требуемому - выходим
    $rash=explode('.',$dir);
    if(($rash[count($rash)-1])!=CONST_RASH)
    {
        return false;
    }
    
    //получаем содержимое файла
    $content=file_get_contents($dir);
    
    //получаем массив замен из константы помещаем в массив
    $replacer=json_decode(CONST_REPLACER, true);
    
    foreach($replacer as $k=>$v)
    {
        if(strpos($content, $k)!==false)
        {
            //если какое-то слово, которое планируется заменить в контенте найдено,
            //то меняем все остальные, записываем и выходим из цикла и функции
            $new_content=str_replace(array_keys($replacer),array_values($replacer),$content);
            
            //что бы вначале посмотреть в каких файлах будет происходить замена можно строку ниже закомментировать
            //file_put_contents($dir,$new_content);
            echo $dir.'<br>';
            return true;
        }
    }
    
    return false;
}



//КОРНЕВАЯ ДИРЕКТОРИЯ В КОТОРОЙ ЛЕЖИТ НАШ ФАЙЛ И В КОТОРОЙ БУДЕТ ПРОИСХОДИТЬ ЗАМЕНА
$dir='.';

//ассоциативный массив замены "старое_значение"=>"новое_значение"
define('CONST_REPLACER',json_encode(array(
    "text1"=>"newtext1",
    "text2"=>"newtext2",
    "text3"=>"newtext3"
    )));
    
    
//ЧТО БЫ В САМОМ ЭТОМ ФАЙЛЕ НИЧЕГО НЕ МЕНЯТЬ
define('CONST_ETOT_FILE',$dir.'/'.pathinfo(__FILE__,PATHINFO_BASENAME));

//С КАКИМ РАСШИРЕНИЕМ ФАЙЛЫ ТРОГАТЬ
define('CONST_RASH','php');

scan($dir);

На эту страницу чаще всего попадают по запросам: replace, замена в файлах, поиск текста в файлах, поиск по файлам, замена в файлах, найти и заменить в файлах, replacer