Как открыть файл и удалить последнюю строку?

Я хочу открыть файл, взять последнюю строку в файле, где строка = "?>", которая является закрывающим тегом для документа php. Затем я хочу добавить в него данные и добавить обратно в «?>» до самой последней строки.

Я пробовал несколько подходов, но мне не повезло.

Вот что я получил до сих пор, поскольку я читаю из zip-файла. Хотя я знаю, что это все неправильно, просто нужна помощь с этим, пожалуйста...

// Open for reading is all we can do with zips and is all we need.
if (zip_entry_open($zipOpen, $zipFile, "r"))
{
    $fstream = zip_entry_read($zipFile, zip_entry_filesize($zipFile));
    // Strip out any php tags from here.  A Bit weak, but we can improve this later.
    $fstream = str_replace(array('?>', '<?php', '<?'), '', $fstream) . '?>';

    $fp = fopen($curr_lang_file, 'r+');

    while (!feof($fp))
    {
        $output = fgets($fp, 16384);
        if (trim($output) == '?>')
            break;
    }

    fclose($fp);
    file_put_contents($curr_lang_file, $fstream, FILE_APPEND);
}

$curr_lang_file — это строка пути к фактическому файлу, к которому необходимо добавить fstream, но после того, как мы удалим последнюю строку, равную '?>'

Хорошо, я на самом деле сделал несколько изменений, и, похоже, это работает, НО теперь данные копируются туда дважды... арггг, так что каждая строка в файле теперь там 2 раза :(

Хорошо, удалил fwrite, хотя теперь он добавляется внизу, чуть ниже ?>

OMG, мне просто нужно все до последней строки, нет ли способа сделать это ??? Мне не нужно "?>"


person SoLoGHoST    schedule 26.04.2010    source источник
comment
Зачем вставлять код в последнюю строку, если код не зависит от порядка выполнения, лучше вставлять после тега ‹?php. Ваш подход не выглядит хорошим для меня.   -  person Srinivas Reddy Thatiparthy    schedule 26.04.2010
comment
Ну, я полагаю, было бы лучше добавить его в конец файла... хм   -  person SoLoGHoST    schedule 26.04.2010


Ответы (3)


Простой способ с файлом в файловой системе:

<?php

$path = "file.txt";
$content = file($path); // Parse file into an array by newline
$data = array_pop($content);

if (trim($data) == '?>') {
    $content[] = 'echo "... again";';
    $content[] = "\n$data";
    file_put_contents($path, implode($content));
}

Что делает..

$ cat file.txt 
<?php
echo 'Hello world';
?>
$ php test.php 
$ cat file.txt 
<?php
echo 'Hello world';
echo "... again";
?>
person Cez    schedule 26.04.2010
comment
Строки в массиве, возвращаемом file, по-прежнему содержат последовательность символов разрыва строки! - person Gumbo; 26.04.2010
comment
Этот код не работает. Вот более полный ответ. - person geomagas; 28.10.2013
comment
@geomagas Это уже завершено - person Cez; 09.11.2013

Он копирует каждую строку дважды из-за вашей строки, в которой говорится:

 @fwrite($fp, $output);

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

person ghoppe    schedule 26.04.2010
comment
Хорошо, спасибо, но мне нужно избавиться от последней строки, где строка = ?›, если нет лучшего способа сделать это...? - person SoLoGHoST; 26.04.2010
comment
Ну я ту строчку убрал, а теперь вообще не убирает ?› :( - person SoLoGHoST; 26.04.2010

Я бы добавил новую <? YOUR CODE ?> после последней строки...

Или, если у вас есть новый код PHP для добавления в $code, это можно сделать с помощью регулярного выражения

$output = preg_replace('\?>','?>'.$code,$output)

person Osama Al-Maadeed    schedule 26.04.2010
comment
Я в замешательстве, что именно это делает? Можете ли вы показать мне лучший пример, используя код, который у меня есть выше? Просто в $fstream также могут быть php-теги, которые, я считаю, тоже должны быть удалены ?? - person SoLoGHoST; 26.04.2010
comment
$fstream = код, который мне нужен, помещен в файл php либо после "<?php", либо до "?>", я полагаю, не имеет значения. Но я бы предпочел, чтобы это было как раз перед "?>". Я закрываю файл слишком рано, должен ли я писать в него по-другому? ОМГ, я так потерялся здесь, я чувствую себя мертвым мозгом! - person SoLoGHoST; 26.04.2010
comment
Хорошо, спасибо, я использую "\n" . '<?' . MY CODE . '?>', однако просто интересно, могу ли я использовать <?php вместо <?, или он не может быть там дважды в документе php? Я чувствую себя здесь глупо, потому что я все еще всему учусь... - person SoLoGHoST; 26.04.2010
comment
Я не могу понять, как работает preg_replace, даже после прочтения руководства по php. Просто не имеет для меня никакого смысла. - person SoLoGHoST; 26.04.2010
comment
@sologhost: Вы можете иметь столько блоков ‹?php ?›, сколько хотите в файле. Практических ограничений нет, кроме того, насколько уродливым и нечитаемым может стать код, если вы разбросаете несколько миллионов или миллиардов таких кодов вокруг. - person Marc B; 26.04.2010
comment
@osama: это добавит код к КАЖДОМУ тегу ?› в файле. В этом случае это нормально, если у sologhost есть только один закрывающий тег, но в противном случае вы получите огромный файл спагетти. - person Marc B; 26.04.2010