Как я удаляю пустые строки из текста в 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
33
задан Peter Mortensen 4 July 2019 в 02:19
поделиться

4 ответа

// 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)
78
ответ дан 27 November 2019 в 17:27
поделиться
    <?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 );
    }
0
ответ дан 27 November 2019 в 17:27
поделиться

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

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

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

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

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

На самом деле в PHP у Вас есть более оптимальный вариант:

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

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

25
ответ дан 27 November 2019 в 17:27
поделиться

Используйте это:

$str = preg_replace('^\s+\r?\n$', '', $str);
1
ответ дан 27 November 2019 в 17:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: