замена строк

Тема в разделе "Как сделать...", создана пользователем despainer, 18 ноя 2010.

Статус темы:
Закрыта.
  1. despainer

    despainer

    Регистр.:
    15 фев 2008
    Сообщения:
    615
    Симпатии:
    168
    Итак есть такой файл

    <site>
    index_dir=/usr/www/site.ru/
    sitename=www.site.com
    </site>

    <site1>
    index_dir=/usr/www/site1.ru/
    sitename=www.site1.ru
    </site>

    <site2>
    index_dir=/usr/www/site1.ru/
    sitename=www.site2.ru
    </site>

    первая задача:
    нужно заменить строку index_dir=/usr/www/site.ru/ на index_dir=/usr/www/sitezzz.ru/ и при этом не трогать строку index_dir=/usr/www/site1.ru/ и sitename=www.site2.ru

    вторая задача:

    удалить из файла:

    <site1>
    index_dir=/usr/www/site1.ru/
    sitename=www.site1.ru
    </site>

    при этом остальные записи не трогать!!!

    как это реализовать на php?
     
  2. propovednik

    propovednik Постоялец

    Регистр.:
    16 май 2008
    Сообщения:
    104
    Симпатии:
    21
    по первой задаче
    PHP:
    str_replace("index_dir=/usr/www/site.ru/","index_dir=/usr/www/sitezzz.ru/",$str)
    не пойдет? :)
    Вы просто как-то туманно объяснили задачу, честно говоря не понял какие строки надо трогать, а какие нет
     
    despainer нравится это.
  3. despainer

    despainer

    Регистр.:
    15 фев 2008
    Сообщения:
    615
    Симпатии:
    168
    прошу прощения немного туманно описал вы правы....
    вот смотрите:
    вот фрагмент из вышестоящего примера:
    Код:
    <site>
    index_dir=/usr/www/site.ru/
    sitename=www.site.com
    </site>
    строку:
    index_dir=/usr/www/site.ru/
    заменить на index_dir=/usr/www/sitezzz.ru/
    если в файле встречается строка index_dir=/usr/www/site.ru/ еще раз то ее не заменять (то есть работать с заменой строки в пределах
    ограниченных тегами <site> </site> и дальше по файлу не лазить :)
    вторая задача:
    удалить из файла фрагмент кода:
    Код:
    <site1>
    index_dir=/usr/www/site1.ru/
    sitename=www.site1.ru
    </site>
     
  4. puika

    puika

    Регистр.:
    25 ноя 2006
    Сообщения:
    262
    Симпатии:
    277
    Скрипт предназначен для поиска и замены одной подстроки на другую
    во всех файлах определенной директории на сервере
    (включая файлы во всех вложенных поддиректориях)

    Которые понимаюь - легко сделают вариант с регулярными выражениями для себя.

    ---------- sr.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 "<b>";
    for ($i=0;$i<$level;$i++) echo "* * ";
    echo $dir."</b>";

    if (@in_array($dir,$excl_dir))
    {
    echo " - needn't search & replace<br>";
    return;
    }

    echo "<br>";

    $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("@!#%xrenoder^&*()".$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<br>";
    }
    else echo " and <b>can't replace</b><br>";
    }

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

    return;
    }

    sr($work_dir);

    echo "SEARCH & REPLACE Complete";

    ?>

    ---------- sr.php - конец цитаты ---------

    Скрипт от хренодёра,сайт не пашет источник http://web.archive.org/web/200611130...der.com/sr.txt
     
    despainer нравится это.
  5. despainer

    despainer

    Регистр.:
    15 фев 2008
    Сообщения:
    615
    Симпатии:
    168
    Код:
    [quote="puika, post: 1654832"]Скрипт предназначен для поиска и замены одной подстроки на другую 
    во всех файлах определенной директории на сервере 
    (включая файлы во всех вложенных поддиректориях)
    Которые понимаюь - легко сделают вариант с регулярными выражениями для себя.
    ---------- sr.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 "<b>";
    for ($i=0;$i<$level;$i++) echo "* * ";
    echo $dir."</b>";
    if (@in_array($dir,$excl_dir))
    {
    echo " - needn't search & replace<br>";
    return;
    }
    echo "<br>";
    $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("@!#%xrenoder^&*()".$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<br>";
    }
    else echo " and <b>can't replace</b><br>";
    }
    }
    elseif($ent!="." and $ent!=".." and is_dir($dir . $ent))
    {
    $level++;
    sr($dir.$ent."/");
    $level--;
    }
    }
    $p->close();
    return;
    }
    sr($work_dir);
    echo "SEARCH & REPLACE Complete";
    ?>
    ---------- sr.php - конец цитаты ---------
    Скрипт от хренодёра,сайт не пашет источник [url]http://web.archive.org/web/200611130...der.com/sr.txt[/url][/QUOTE]
    
    не то
    вопрос то как ограничить поиск\замену между указанными тегами нужен пример
     
  6. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    PHP:
    $newtext preg_replace ("/(<site>[^<]+?index_dir=)\/usr\/www\/site\.ru\/
    ([^<]+?</site>)/i"
    "$1\/usr\/www\/sitezzz\.ru\/$2"$text);
     
    despainer нравится это.
  7. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    Может и извращенное, но рабочее решение первой задачи

    PHP:
    <?
    $lines file ('sites.file'); //загрузит с разбивкой по строкам

    $num_zamena 0// количество замен
    $str_searche "index_dir=/usr/www/site.ru/"// Что менять
    $str_replace "index_dir=/usr/www/sitezzz.ru/"// На что менять
    foreach ($lines as $line_num => $line) { // теперь по всем строкам пройдемся и применим фильтры
        
    if (!$num_zamena == 1) {
            if ( 
    md5($line) == md5($str_searche."\r\n") ){
                
    $line $str_replace "\r\n";
                
    $num_zamena 1;
            }
        }
        echo 
    $line;
    }
    ?>
     
    despainer нравится это.
Статус темы:
Закрыта.