web-dev-qa-db-de.com

Entfernen Sie mehrere Leerzeichen

Ich erhalte $row['message'] Aus einer MySQL-Datenbank und muss alle Leerzeichen wie \n\t Und so weiter entfernen.

$row['message'] = "This is   a Text \n and so on \t     Text text.";

sollte formatiert werden:

$row['message'] = 'This is a Text and so on Text text.';

Ich habe es versucht:

 $ro = preg_replace('/\s\s+/', ' ',$row['message']);
 echo $ro;

es werden jedoch nicht \n oder \t, sondern nur einzelne Leerzeichen entfernt. Kann mir jemand sagen, wie das geht?

191
creativz

Du brauchst:

$ro = preg_replace('/\s+/', ' ',$row['message']);

Sie verwenden \s\s+, Was Leerzeichen (Leerzeichen, Tabulator oder Zeilenvorschub) gefolgt von einem oder mehreren Leerzeichen bedeutet. Das bedeutet effektiv, dass zwei oder mehr Leerzeichen durch ein einzelnes Leerzeichen ersetzt werden.

Sie möchten ein oder mehrere Leerzeichen durch einzelne Leerzeichen ersetzen, sodass Sie das Muster \s\s* Oder \s+ Verwenden können (empfohlen).

366
codaddict
<?php
$str = "This is  a string       with
spaces, tabs and newlines present";

$stripped = preg_replace(array('/\s{2,}/', '/[\t\n]/'), ' ', $str);

echo $str;
echo "\n---\n";
echo "$stripped";
?>

Dies gibt aus

This is  a string   with
spaces, tabs and newlines present
---
This is a string with spaces, tabs and newlines present
64
Cez
preg_replace('/[\s]+/mu', ' ', $var);

\s enthält bereits Tabulatoren und neue Zeilen, daher scheint der obige reguläre Ausdruck ausreichend zu sein.

12
Anonymous

vereinfacht zu einer Funktion:

function removeWhiteSpace($text)
{
    $text = preg_replace('/[\t\n\r\0\x0B]/', '', $text);
    $text = preg_replace('/([\s])\1+/', ' ', $text);
    $text = trim($text);
    return $text;
}

basierend auf Danuel O'Neal Antwort.

10
Lukas
$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);
7
ghostdog74

Ich kann das Problem hier nicht wiederholen:

$x = "this    \n \t\t \n    works.";
var_dump(preg_replace('/\s\s+/', ' ', $x));
// string(11) "this works."

Ich bin nicht sicher, ob es nur ein Transkriptionsfehler war oder nicht, aber in Ihrem Beispiel verwenden Sie eine Zeichenfolge in Anführungszeichen. \n und \t werden nur als Zeilenvorschub und Tabulator behandelt, wenn Sie eine Zeichenfolge in doppelten Anführungszeichen haben. Das ist:

'\n\t' != "\n\t"

Bearbeiten: wie Codaddict ausführte, \s\s+ ersetzt kein einzelnes Tabulatorzeichen. Ich denke immer noch nicht mit \s+ ist jedoch eine effiziente Lösung. Wie wäre es stattdessen damit:

preg_replace('/(?:\s\s+|\n|\t)/', ' ', $x);
7
nickf

Ohne preg_replace ()

$str = "This is   a Text \n and so on \t     Text text.";
$str = str_replace(["\r", "\n", "\t"], " ", $str);
while (strpos($str, "  ") !== false)
{
    $str = str_replace("  ", " ", $str);
}
echo $str;
4
hharek
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

Dadurch werden alle Tabulatoren, alle Zeilenumbrüche und alle Kombinationen mehrerer Leerzeichen, Tabulatoren und Zeilenumbrüche durch ein einzelnes Leerzeichen ersetzt.

4
middus
<?php
#This should help some newbies
# REGEX NOTES FROM DANUEL
# I wrote these functions for my own php framework
# Feel Free to make it better
# If it gets more complicated than this. You need to do more software engineering/logic.
# (.)  // capture any character
# \1   // if it is followed by itself
# +    // one or more

class whitespace{

    static function remove_doublewhitespace($s = null){
           return  $ret = preg_replace('/([\s])\1+/', ' ', $s);
    }

    static function remove_whitespace($s = null){
           return $ret = preg_replace('/[\s]+/', '', $s );
    }

    static function remove_whitespace_feed( $s = null){
           return $ret = preg_replace('/[\t\n\r\0\x0B]/', '', $s);
    }

    static function smart_clean($s = null){
           return $ret = trim( self::remove_doublewhitespace( self::remove_whitespace_feed($s) ) );
    }
}
$string = " Hey   yo, what's \t\n\tthe sc\r\nen\n\tario! \n";
echo whitespace::smart_clean($string);
3
Danuel O'Neal

Das würde ich verwenden:

ein. Stellen Sie sicher, dass Sie doppelte Anführungszeichen verwenden, zum Beispiel:

$row['message'] = "This is   a Text \n and so on \t     Text text.";

b. Um zusätzliche Leerzeichen zu entfernen, verwenden Sie:

$ro = preg_replace('/\s+/', ' ', $row['message']); 
echo $ro;

Es ist vielleicht nicht die schnellste Lösung, aber ich denke, es wird den geringsten Code erfordern und es sollte funktionieren. Ich habe allerdings noch nie MySQL verwendet, daher kann ich mich irren.

1
matsolof

Sie müssen es nur wie folgt ausführen:

echo preg_replace('/\s{2,}/', ' ', "This is   a Text \n and so on \t     Text text."); // This is a Text and so on Text text.
1
Alex Polo

In Wahrheit, wenn Sie denken, dass Sie so etwas wollen:

preg_replace('/\n+|\t+|\s+/',' ',$string);
0
BigBlast

dadurch werden mehrere Registerkarten durch eine einzige Registerkarte ersetzt

preg_replace("/\s{2,}/", "\t", $string);
0
Heman G

Ich benutze diesen Code und dieses Muster:

preg_replace('/\\s+/', ' ',$data)

$data = 'This is   a Text 
   and so on         Text text on multiple lines and with        whitespaces';
$data= preg_replace('/\\s+/', ' ',$data);
echo $data;

Sie können dies unter http://writecodeonline.com/php/ testen

0
Catalin T.