PHP: удалить первую строку текста и вернуть остальные - PullRequest
18 голосов
/ 12 октября 2011

Каков наилучший способ удалить самую первую строку текстовой строки, а затем отобразить остальные в PHP?

Например.

Это текстовая строка:

$t=<<<EOF
First line to be removed
All the rest
Must remain
EOF;

Это окончательный вывод:

All the rest
Must remain

Если бы я работал с файлом в Bash, я мог бы легко сделать следующее:

sed -i~ 1d target-file

Или:

tail -n +2 source-file > target-file

Есть идеи?

Ответы [ 8 ]

33 голосов
/ 12 октября 2011

Вместо explode() и implode вы также можете использовать strpos() и substr().

<?php

function stripFirstLine($text)
{        
  return substr( $text, strpos($text, "\n")+1 );
}
echo stripFirstLine( "First line.\nSecond line.\nThird line.");

?>

Этот метод также быстрее, чем работа с массивами. Смотрите мой тест скорости: http://codepad.org/GTom43HJ

Живой пример: http://codepad.org/P8KXnqQf

24 голосов
/ 12 октября 2011

Как насчет preg_replace:

$text = "First line.\nSecond line.\nThird line.";
echo preg_replace('/^.+\n/', '', $text);

Таким образом, вам не нужно беспокоиться о случае, когда в вашем файле нет новой строки.
http://codepad.org/fYZuy4LS

5 голосов
/ 12 октября 2011

explode() он в строке разбивается на массив, shift() от первой строки и воссоединяется с остальными.

$arr = explode("\n", $t);
array_shift($arr);
echo implode("\n", $arr);

// Prints
// All the rest
// Must remain

Если ваша строка действительно большая, это займет много памяти. Но если ваши строки сопоставимы с вашим примером, он будет работать нормально.

Метод 2, с использованием strpos()

echo substr($t, strpos($t, "\n") + 1);
3 голосов
/ 12 мая 2015

Я знаю, что это поздний ответ, но почему бы вам не использовать разнесение и ограничить количество результатов

$parts = explode("\n", $test, 2);
//$parts[0] has the first line
//$parts[1] has everything else
0 голосов
/ 03 июля 2019

Я попробовал все это, но ни один из них не работал достаточно быстро с большими файлами (50 МБ +).Вот решение, которое я создал.В вашем случае вы можете опустить эхо первой строки.

$fh = fopen($local_file, 'rb');
echo "add\tfirst\tline\n";  // add your new first line.
fgets($fh); // moves the file pointer to the next line.
echo stream_get_contents($fh); // flushes the remaining file.
fclose($fh);
0 голосов
/ 13 февраля 2017

Все ответы неэффективны. Нет необходимости использовать какие-либо функции для работы со строкой.

$pos = 0;
while ($str[$pos] !== PHP_EOL)
    $str[$pos++] = '';
echo $str;

Если вы не уверены, что строка всегда содержит более одной строки, используйте это:

if (strpos($str, PHP_EOL))
{
    $pos = 0;
    while ($str[$pos] !== PHP_EOL)
        $str[$pos++] = '';
    echo $str;
}
0 голосов
/ 15 декабря 2016

Более гибкое решение, где вы можете удалить 1 или более строк и вернуть остальные.

function striplines($s,$n){
    $arr = explode("\n", $s);
    for ($i=0;$i<$n;$i++) array_shift($arr);
    return implode("\n", $arr);
}

//remove first two lines
echo striplines("First line.\nSecond line.\nThird line.",2); //returns/prints only Third line
0 голосов
/ 12 октября 2011

Возвращает подстроку после первого символа новой строки:

$firstLineRemoved = $subject;
$firstNewlinePosition = strpos($subject, "\n");
if($firstNewlinePosition !== false)
{
  $firstLineRemoved = substr($subject, firstNewlinePosition +1);
}
echo $firstLineRemoved;

Редактировать: тот же пример, что и @ComFreek, но с проверкой ошибок в случае отсутствия символа новой строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...