Подтвердить что ты не робот

Как удалить пустые строки из текста в PHP?

Мне нужно удалить пустые строки (с пробелами или абсолютно пустыми) в PHP. Я использую это регулярное выражение, но оно не работает:

$str = ereg_replace('^[ \t]*$\r?\n', '', $str);
$str = preg_replace('^[ \t]*$\r?\n', '', $str);

Я хочу получить результат:

blahblah

blahblah

   adsa 


sad asdasd

будут:

blahblah
blahblah
   adsa 
sad asdasd
4b9b3361

Ответ 1

// New line is required to split non-blank lines
preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string);

Вышеупомянутое регулярное выражение говорит:

/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/
    1st Capturing group (^[\r\n]*|[\r\n]+)
        1st Alternative: ^[\r\n]*
        ^ assert position at start of the string
            [\r\n]* match a single character present in the list below
                Quantifier: Between zero and unlimited times, as many times as possible, giving back as needed [greedy]
                \r matches a carriage return (ASCII 13)
                \n matches a fine-feed (newline) character (ASCII 10)
        2nd Alternative: [\r\n]+
            [\r\n]+ match a single character present in the list below
            Quantifier: Between one and unlimited times, as many times as possible, giving back as needed [greedy]
            \r matches a carriage return (ASCII 13)
            \n matches a fine-feed (newline) character (ASCII 10)
    [\s\t]* match a single character present in the list below
        Quantifier: Between zero and unlimited times, as many times as possible, giving back as needed [greedy]
        \s match any white space character [\r\n\t\f ]
        \tTab (ASCII 9)
    [\r\n]+ match a single character present in the list below
        Quantifier: Between one and unlimited times, as many times as possible, giving back as needed [greedy]
        \r matches a carriage return (ASCII 13)
        \n matches a fine-feed (newline) character (ASCII 10)

Ответ 2

Ваше ereg-replace() неверно, потому что ereg/eregi устарели. Ваш preg_replace() даже не скомпилируется, но если вы добавите разделители и установите многострочный режим, он будет работать нормально:

$str = preg_replace('/^[ \t]*[\r\n]+/m', '', $str);

Модификатор m позволяет ^ соответствовать началу логической строки, а не только началу всей строки. Якорь начала строки необходим, потому что без него регулярное выражение будет соответствовать новой строке в конце каждой строки, а не только пустым. Вам не нужен конец строки ($), потому что вы активно сопоставляете символы новой строки, но это не повредит.

Принятый ответ выполняет работу, но он сложнее, чем должен быть. Регулярное выражение должно соответствовать либо началу строки (^[\r\n]*, многострочный режим не задан), либо хотя бы одной новой строке ([\r\n]+), за которой следует хотя бы одна новая строка ([\r\n]+). Таким образом, в особом случае строки, которая начинается с одной или нескольких пустых строк, они будут заменены одной пустой строкой. Я уверен, что не желаемый результат.

Но большую часть времени он заменяет два или более последовательных символа новой строки вместе с любым горизонтальным пробелом (пробелами или табуляцией), который находится между ними, одним переводом строки. Это намерение, во всяком случае. Автор, похоже, ожидает, что \s будет соответствовать только \x20 (\x20), хотя на самом деле он соответствует любому пробелу. Это очень распространенная ошибка. Фактический список варьируется от одного варианта регулярного выражения к следующему, но как минимум вы можете ожидать, что \s будет соответствовать любому [ \t\f\r\n] совпадению.

На самом деле, в PHP у вас есть лучший вариант:

$str = preg_replace('/^\h*\v+/m', '', $str);

\h соответствует любому горизонтальному пробелу, а \v соответствует вертикальному пробелу.

Ответ 3

Просто взорвите строки текста в массив, удалите пустые строки с помощью array_filter и снова размойте массив.

$tmp = explode("\n", $str);
$tmp = array_filter($tmp);
$str = implode("\n", $tmp);

Или в одной строке:

$str = implode("\n", array_filter(explode("\n", $str)));

Я не знаю, но это возможно быстрее, чем preg_replace.

Ответ 4

Комментарий от Bythos от ссылки Jamie выше работал у меня:

/^\n+|^[\t\s]*\n+/m

Я не хотел снимать все новые строки, только пустые/пробельные. Это делает трюк!

Ответ 5

Использовать этот:

$str = preg_replace('^\s+\r?\n$', '', $str);

Ответ 6

Попробуйте это:

$str = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\r\n", $str);

Если вы выводите это в текстовый файл, он выдаст тот же вывод в простых Блокноте, WordPad, а также в текстовых редакторах, например Notepad++.

Ответ 7

Нет необходимости слишком усложнять вещи. Это может быть достигнуто с помощью простого короткого регулярного выражения:

$text = preg_replace("/(\R){2,}/", "$1", $text);

(\R) соответствует всем символам новой строки.
{2,} соответствует двум или более вхождениям.
$1 использует первую обратную ссылку (EOL для конкретной платформы) в качестве замены.

Ответ 8

function trimblanklines($str) {
    return preg_replace('`\A[ \t]*\r?\n|\r?\n[ \t]*\Z`','',$str);
}

Этот только удаляет их от начала и до конца, а не от середины (если кто-то еще искал это).

Ответ 9

Принятый ответ оставляет дополнительный прерывание строки в конце строки. Использование rtrim() приведет к удалению этой последней строки:

rtrim(preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string));

Ответ 10

Из этого ответа у меня нормально работает следующее!

$str = "<html>
<body>";

echo str_replace(array("\r", "\n"), '', $str);

Ответ 11

    <?php

    function del_blanklines_in_array_q($ar){
        $strip = array();
        foreach($ar as $k => $v){
            $ll = strlen($v);
            while($ll--){
                if(ord($v[$ll]) > 32){  //hex /0x20 int 32 ascii SPACE
                    $strip[] = $v; break; 
                }
            }
        }
        return $strip;
    }

    function del_blanklines_in_file_q($in, $out){
        // in filename, out filename
        $strip = del_blanklines_in_array_q(file($in));
        file_put_contents($out, $strip );
    }