wake-up-neo.com

Wie entferne ich leere Zeilen aus PHP in PHP?

Ich muss in PHP leere Zeilen entfernen (mit Leerzeichen oder absolut leer). Ich benutze diesen regulären Ausdruck, aber es funktioniert nicht:

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

ich möchte das Ergebnis von:

blahblah

blahblah

   adsa 


sad asdasd

werden:

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

Der obige reguläre Ausdruck sagt:

/(^[\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)
71
Michael Wales

Ihre ereg-replace()-Lösung ist falsch, da die ereg/eregi-Methoden veraltet sind. Ihr preg_replace() wird nicht einmal kompilieren, aber wenn Sie Trennzeichen hinzufügen und den Multilinienmodus einstellen, funktioniert es gut:

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

Mit dem Modifizierer m kann ^ am Anfang einer logischen Zeile und nicht nur am Anfang des gesamten Strings liegen. Der Zeilenanfangsanker ist notwendig, da der Regex ohne ihn mit dem Zeilenumbruch am Ende jeder Zeile übereinstimmen würde, nicht nur mit den Leerzeilen. Sie brauchen den Anker für den Zeilenende ($) nicht, da Sie die Zeilenumbrüche aktiv abgleichen, aber es tut nicht weh.

Die akzeptierte Antwort erledigt den Job, ist aber komplizierter als es sein muss. Der reguläre Ausdruck muss entweder mit dem Anfang der Zeichenfolge (^[\r\n]*, Multiline-Modus nicht festgelegt) oder mindestens einer Zeilenvorschubzeile ([\r\n]+) und mindestens einer Zeilenumbruchzeile ([\r\n]+) übereinstimmen. Im Sonderfall einer Zeichenfolge, die mit einer oder mehreren Leerzeilen beginnt, werden diese durch Eins Leerzeilen ersetzt. Ich bin mir ziemlich sicher, dass das nicht das gewünschte Ergebnis ist.

Meistens werden jedoch zwei oder mehr aufeinanderfolgende Zeilenumbrüche zusammen mit etwaigen horizontalen Leerzeichen (Leerzeichen oder Tabulatoren), die zwischen ihnen liegen, durch einen Zeilenvorschub ersetzt. Das ist sowieso die Absicht. Der Autor scheint zu erwarten, dass \s nur mit dem Leerzeichen (\x20) übereinstimmt, obwohl es tatsächlich mit einem beliebigen Leerzeichen übereinstimmt. Das ist ein sehr häufiger Fehler. Die tatsächliche Liste variiert von Regex zu Variante, aber Sie können zumindest erwarten, dass \s mit dem übereinstimmt, was mit [ \t\f\r\n] übereinstimmt.

Eigentlich haben Sie in PHP eine bessere Option:

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

\h entspricht einem beliebigen horizontalen Leerzeichen und \v entspricht einem vertikalen Leerzeichen.

23
Alan Moore

Zerreißen Sie einfach die Zeilen des Textes in ein Array, entfernen Sie leere Zeilen mit array_filter und implodieren Sie das Array erneut.

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

Oder in einer Zeile:

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

Ich weiß es nicht, aber das ist vielleicht schneller als preg_replace.

10
Ben

Der Kommentar von Bythos von Jamies Link oben funktionierte für mich:

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

Ich wollte nicht alle neuen Zeilen entfernen, nur die leeren/Whitespace-Zeilen. Das macht den Trick!

6
Dan Power

Probier diese:

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

Wenn Sie dies in eine Textdatei ausgeben, wird dieselbe Ausgabe auf einfachen Notizblock, Wordpad und auch auf Texteditoren, z. B. Notepad ++, ausgegeben.

1
Nauman Tahir

was ist damit?

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

Die akzeptierte Antwort hinterlässt am Ende der Zeichenfolge einen zusätzlichen Zeilenumbruch. Mit rtrim() wird dieser letzte Zeilenumbruch entfernt:

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

Es ist nicht nötig, Dinge zu kompliziert zu machen, dies kann mit einem einfachen kurzen Regex erreicht werden:

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

Der (\R) stimmt mit allen Zeilenumbrüchen überein
Der {2,} stimmt mit zwei oder mehr Vorkommen überein
Der $1 verwendet die erste Rückreferenz (plattformspezifische EOL) als Ersatz

0
Paul

Von diese Antwort , funktioniert gut für mich!

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

echo str_replace(array("\r", "\n"), '', $str);
0
    <?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
user12047752
function trimblanklines($str) {
    return preg_replace('`\A[ \t]*\r?\n|\r?\n[ \t]*\Z`','',$str);
}

Dieser entfernt sie nur vom Anfang und Ende, nicht von der Mitte (falls jemand anderes danach gesucht hat).

0
mpen