Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Найти строку в файле и записать после неё новую строку
 
 автор: FireTiger   (10.01.2008 в 11:43)   письмо автору
 
 

Сразу к вопросу: Как так сделать, чтобы скрипт открывал файл, потом искал в нем определенную строку, и после найденной строки в файле, вписывал другую строку и сохранял изменения. Сам пробовал, не получается. Кто знает помогите плз.

   
 
 автор: KPETuH   (10.01.2008 в 12:14)   письмо автору
 
   для: FireTiger   (10.01.2008 в 11:43)
 

покажите код того что сами наваяли поможем...

   
 
 автор: FireTiger   (10.01.2008 в 12:49)   письмо автору
 
   для: KPETuH   (10.01.2008 в 12:14)
 


<?php
$find_str 
"$a = 'aaaaaa';";
$str_paste "'/r/n'.$b = 'bbbbbb';";
$strlen_find_str strlen($find_str);

$editfile fopen('editfile.php'"wb");

// Здесь как-то вставить $str_paste после  $find_str и записать все остальное содержимое файла после $str_paste и все записать в строку $result

fwrite($editfile$result);
    
fclose($editfile);
?>


Просто не могу придумать как. Ну и содержимое файла editfile.php


<?php
 $d 
'dddddd';
 
$a 'aaaaaa';
 
$x 'xxxxxx';
?>

   
 
 автор: bronenos   (10.01.2008 в 13:24)   письмо автору
 
   для: FireTiger   (10.01.2008 в 12:49)
 

<?php
$file 
file_get_contents("editfile.php");
$fp fopen("editfile.php""w");
fwrite($fpstr_replace($a$a."и что-то после нее..."$file));
fclose($fp);
?>

   
 
 автор: FireTiger   (10.01.2008 в 13:33)   письмо автору
 
   для: bronenos   (10.01.2008 в 13:24)
 

Спасибо, сейчас попробую

   
 
 автор: FireTiger   (10.01.2008 в 13:38)   письмо автору
 
   для: bronenos   (10.01.2008 в 13:24)
 

Пишет что переменая не определена и не записывает... Что делать?

   
 
 автор: bronenos   (10.01.2008 в 14:11)   письмо автору
 
   для: FireTiger   (10.01.2008 в 13:38)
 

$a - это искомый отрезок, если вы не поняли, а не записывает - права поставьте 777

   
 
 автор: FireTiger   (10.01.2008 в 14:18)   письмо автору
 
   для: bronenos   (10.01.2008 в 14:11)
 

Да я понял что $a - переменная из файла editfile.php, но все равно не записывает, у меня локалка, там с правами все ок.

   
 
 автор: mihdan   (10.01.2008 в 15:11)   письмо автору
 
   для: FireTiger   (10.01.2008 в 14:18)
 


<?php
$file 
file_get_contents("editfile.php");
$fp fopen("editfile.php""w");
// $a - то что найти нужно, она и не будет определена!!!
fwrite($fpstr_replace("$a""$a \nи что-то после нее..."$file));
fclose($fp);
?> 


Лучше preg_replace, ereg_replace


<?php
$file 
file_get_contents("editfile.php");
$fp fopen("editfile.php""w");
// $a - то что найти нужно, она и не будет определена!!!
fwrite($fppreg_replace("/(\$a.*)\s*/si""\\1 \n и что-то после нее..."$file));
fclose($fp);
?> 

   
 
 автор: bronenos   (10.01.2008 в 15:22)   письмо автору
 
   для: mihdan   (10.01.2008 в 15:11)
 

Излишний мудреж 0.о
UPD: блин, кажется я сначала прочитал непрально то что нужно автору, mihdan, извиняюсь

   
 
 автор: kasmanaft   (10.01.2008 в 15:29)   письмо автору
 
   для: mihdan   (10.01.2008 в 15:11)
 

Рег. выражение я бы изменил на
"/".preg_quote($find_str).".*/i"
убрал модификатор s, ибо он вроде как тут не нужен.
А "\\1 \n и что-то после нее...", наверное, придется заменить на "\\0 и что-то после нее... \r\n"

   
 
 автор: mihdan   (10.01.2008 в 15:34)   письмо автору
 
   для: kasmanaft   (10.01.2008 в 15:29)
 

bronenos, не страшно сам так часто ошибаюсь
kasmanaft, \s - пробельные символы

А в целом согласен - перемудрили

Можно прочитать файл с помощью file()
При помощи in_array() найти индекс массива с искомой строкой - заменить его на новый
Склеить строку при помощи implode()
Записать все обратно fwrite()

   
 
 автор: kasmanaft   (10.01.2008 в 15:53)   письмо автору
 
   для: mihdan   (10.01.2008 в 15:34)
 

Я тоже малость ошибся.. В общем, модификатор s надо убрать в любом случае, а потом 2 варианта:
либо оставить \s* и replacement заменить на "\\0 и что-то после нее... \r\n"
либо убрать \s*, но replacement не трогать: "\\0 \r\n и что-то после нее..." (я бы сделал так)
(\r\n в разным местах будет)
Не проверял, но вроде бы должно работать так.

А насчет "перемудрили" я вот что думаю:
Если известно точно, что в файле есть строка "$a = 'aaaaaa';" (то есть нет ни пробелов слева/справа, ни других знаков), то можно обойтись без рег. выражений.
А с ними, на мой взгляд, удобнее.

   
 
 автор: FireTiger   (10.01.2008 в 17:38)   письмо автору
 
   для: kasmanaft   (10.01.2008 в 15:53)
 

а зачем вообще рег. выражения использовать? мне нужно конкретно найти точно строку и после нее вписать. То есть в конченом результате я хочу чтобы после всех действий получилоь так:

<?php 
 $d 
'dddddd'
 
$a 'aaaaaa'
 
$b 'bbbbbb'
 
$x 'xxxxxx'
?>

Как я понял что вы подумали, что я хочу в значение переменной $a дописать, нет, мне нужно вписать определение новой переменной $b после определения переменной $a. Но также скрипт должен например просто строку вида условия искать

if(aaa){
какие-то действия
}


и в файл записывать новый данные, например тоже типа цикла строку вставить. Может я неочень хорошо выразился...

   
 
 автор: FireTiger   (10.01.2008 в 17:58)   письмо автору
 
   для: FireTiger   (10.01.2008 в 17:38)
 

Вроде получилось... Но скрипт не может искать строку содержащую выражения php. Как так сделать, чтобы в переменной можно было записать код вида:

<?php
$text 
"
if(
$a = 15){ echo "какой-то текст"; } 
while(условие){
 тело цикла
}
"
;
?>


Видите, ошибка получается... Как сделать?

Позже добавил:
Ой, спросил у вас, но сам не попробовал, у меня получилось... Если кому надо - <<<HTML текст всякий HTML;

   
 
 автор: FireTiger   (10.01.2008 в 18:33)   письмо автору
 
   для: FireTiger   (10.01.2008 в 17:58)
 

Все, справился, огромное всем спасибо за помощь! Вот проверьте готовый вариант:

<?php 
$file 
file_get_contents("editfile.php"); 
$paste_str = <<<HTML
\n \$b = 'bbbbbb';
HTML;
$find_str = <<<HTML
\$a = 'aaaaaa';
HTML;
$fp fopen("editfile.php""w"); 

fwrite($fpstr_replace($find_str$find_str.$paste_str$file)); 
fclose($fp); 
?>

Все хорошо? Или что-то плохо?

   
 
 автор: mihdan   (11.01.2008 в 15:47)   письмо автору
 
   для: FireTiger   (10.01.2008 в 18:33)
 

Норма

   
 
 автор: FireTiger   (14.02.2008 в 00:02)   письмо автору
 
   для: mihdan   (11.01.2008 в 15:47)
 

Попытался вставить этот скрипт в отдельный файл, как класс для добавления, но вот возникают вопросы. Во-первых можете проверить код:


class install {

    var $file = null;
    var $edit_file = null;
    var $error_open = null;
    var $error_find = null;

function action($action,$file,$str_find,$str_act) {

    if($action == 'add'){
            for($i = 0; $i <= count($str_find); $i++){
    
                if(!file_exists($file) || $file == '') { $this->error_open[$file] = "Невозможно загрузить файл: ". $file; return false;}
                
                if(!($error_open)) {
                
                    
                    $this->edit_file = file_get_contents($file);
                    $fp = fopen($file, "w");
                
                    $find_pos = strpos($file,$str_find[$i]);
                    if(!$find_pos) { $this->error_find[$file] = "Не удается найти строку: ". $str_find[$i]; }
                    
                    if(!($error_find)){
                        $result = str_replace($str_find[$i], $str_find[$i].$str_act[$i], $this->edit_file);
                        fwrite($fp, $result);
                        unset($result);
                    }
                }            
        }
        
    }


и как он работает:


<?
require_once('installtws.class.php');

$install = new install;

$find_add[0] = '
              aaaaaa
'
;


$add[0] = '
    bbbbbb
'
;

$install->action('add','files/options.php',$find_add,$add);
?>

Почему в массив ошибок ненайденных строк не запичывается сама строка? Почему ее нельзя вывести и т.п.?
И еще, сам скрипт не тяжелый?
Можно это выгодней реализовать?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования