Entfernen Sie überschüssiges Leerzeichen aus einer Zeichenfolge

132

Ich erhalte eine Zeichenfolge aus einer Datenbankabfrage und entferne dann alle HTML-Tags, Zeilenumbrüche und Zeilenumbrüche, bevor ich sie in eine CSV-Datei einfüge. Das einzige ist, ich kann keinen Weg finden, den überschüssigen Leerraum zwischen den Saiten zu entfernen .

Was wäre der beste Weg, um die inneren Leerzeichen zu entfernen?

Joepour
quelle
6
Bitte senden Sie ein Muster der Originalzeichenfolge und der gewünschten Zeichenfolge.
Zote
Können Sie auch klären, wie die endgültige Ausgabe sein muss? Fügen Sie die Kommas in Daten für CSV ein, rufen Sie sie aus einer Datenbank mit bereits darin enthaltenen Kommas ab, geben Sie Zeichenfolgen in eine Funktion ein, die das Einfügen von CSVs usw. übernimmt?
Frank DeRosa
ok, die endgültige Ausgabe muss eine Zeichenfolge sein, wobei jedes Wort durch ein einzelnes Leerzeichen getrennt ist. Im Moment handelt es sich um mehrere Leerzeichen.
Joepour
1
@ Joe, ich würde keine Zeit verschwenden und all denen Ehre machen, die dir schon einmal geholfen haben! :)
Frankie

Antworten:

286

Sie wissen nicht genau, was Sie wollen, aber hier sind zwei Situationen:

  1. Wenn Sie nur den Umgang mit Überschuss whitespacean den Anfang oder das Ende der Zeichenfolge , die Sie verwenden können trim(), ltrim()oder rtrim()es zu entfernen.

  2. Wenn Sie mit zusätzlichen Leerzeichen innerhalb einer Zeichenfolge arbeiten, ziehen Sie eine preg_replacevon mehreren whitespaces " "*mit einer einzelnen whitespace " ".

Beispiel:

$foo = preg_replace('/\s+/', ' ', $foo);
jW.
quelle
62
$ foo = preg_replace ('/ \ s + /', '', $ foo);
Genio
mit dem $foo = preg_replace( '/\s+/', ' ', $foo );Willen töten die Auswirkungen vonnl2br()
Waiyl Karim
1
Verwenden Sie einfach nl2br, bevor Sie preg_replace verwenden, und Sie sollten bereit sein.
Lukas Liesis
Tippfehler / Escaper-Hinweis - Wenn der Code kein zusätzliches Leerzeichen für Sie entfernt - stellen Sie sicher, dass Sie "\" vor "s" haben :) Einige Online-PHP-
Testseiten
Das sollte CSS-sicher sein, oder? Wie in würde dies sicher eine Variable komprimieren, die eine lange, mehrzeilige CSS-Zeichenfolge enthält?
David
50
$str = str_replace(' ','',$str);

Oder ersetzen Sie durch Unterstrich, & nbsp; etc etc. etc.

Cory Dee
quelle
7
Dadurch werden alle Leerzeichen entfernt. Er will nur die Saite normalisieren.
Svend
12
Was ich suchte (obwohl es nicht die Frage war)
Sevenearths
@Gigala "Was wäre der beste Weg, um die inneren Leerzeichen zu entfernen?" war die Frage. Diese Antwort erfüllt das perfekt.
Cory Dee
1
@CoryDee Das stimmt, für diesen letzten einzelnen Satz. In der Einleitung wird die Frage jedoch als " überschüssiges Leerzeichen" formuliert , wobei der Überschuss im Vordergrund steht. Sie haben das IST-Problem des OP befriedigt, es spielt also keine große Rolle, aber solange wir technisch werden ...
Spencer Ruskin
Das funktioniert nicht , wenn die Zählung der Räume ist gerade Zahl , sagen wir: Hi Earthmit 4 Räumen dazwischen werden werden: HiEarth. Dies löst mein Problem nicht mit der Frage relevant.
JJ Labajo
26

$str = trim(preg_replace('/\s+/',' ', $str));

Die obige Codezeile entfernt zusätzliche Leerzeichen sowie führende und nachfolgende Leerzeichen.

d -_- b
quelle
25

Keines der anderen Beispiele hat für mich funktioniert, daher habe ich dieses verwendet:

trim(preg_replace('/[\t\n\r\s]+/', ' ', $text_to_clean_up))

Dies ersetzt alle Tabulatoren, neuen Zeilen, doppelten Leerzeichen usw. durch einfache 1 Leerzeichen.

Lukas Liesis
quelle
Danke, @ wp78de, aber aus irgendeinem Grund hatte ich Probleme mit nur \s+. Obwohl es im Jahr 2014 war, ist es vielleicht geändert worden, hat PHP in den letzten 3 Jahren nicht berührt, kann keinen Kommentar abgeben, wird aber die aktuelle Antwort hinterlassen, während es eine Lösung war und in einigen Fällen immer noch sein kann.
Lukas Liesis
9

Wenn Sie beispielsweise nur mehrere Leerzeichen in einer Zeichenfolge ersetzen möchten: "this string have lots of space . " Und Sie erwarten, dass die Antwort lautet "this string have lots of space", können Sie die folgende Lösung verwenden:

$strng = "this string                        have lots of                        space  .   ";

$strng = trim(preg_replace('/\s+/',' ', $strng));

echo $strng;
Apsar
quelle
5

Die Verwendung von preg_replace () weist Sicherheitslücken auf, wenn Sie die Nutzdaten von Benutzereingaben [oder anderen nicht vertrauenswürdigen Quellen] erhalten. PHP führt den regulären Ausdruck mit eval () aus. Wenn die eingehende Zeichenfolge nicht ordnungsgemäß bereinigt wird, besteht die Gefahr, dass Ihre Anwendung einer Code-Injektion unterzogen wird .

In meiner eigenen Anwendung habe ich mich nicht um die Bereinigung der Eingabe gekümmert (und da ich mich nur mit kurzen Zeichenfolgen befasse), sondern um eine etwas prozessorintensivere Funktion, die jedoch sicher ist, da sie nichts auswertet ().

function secureRip(string $str): string { /* Rips all whitespace securely. */
  $arr = str_split($str, 1);
  $retStr = '';
  foreach ($arr as $char) {
    $retStr .= trim($char);
  }
  return $retStr;
}
Fom
quelle
Es wird nur mit eval ausgeführt, wenn Sie den Modifikator 'e' angeben: php.net/manual/en/…. Außerdem heißt es: "Diese Funktion wurde in PHP 5.5.0 VERRINGERT und ab PHP 7.0.0 ENTFERNT. "" Sie können also in preg_replace keine Inhalte mehr bewerten.
ADJenks
4
$str = preg_replace('/[\s]+/', ' ', $str);
Sandip Layek
quelle
2

Sie können verwenden:

$str = trim(str_replace("  ", " ", $str));

Dadurch werden zusätzliche Leerzeichen von beiden Seiten der Zeichenfolge entfernt und zwei Leerzeichen in eins innerhalb der Zeichenfolge konvertiert . Beachten Sie, dass dadurch nicht drei oder mehr Leerzeichen hintereinander in eins umgewandelt werden! Eine andere Möglichkeit, die ich vorschlagen kann, ist die Verwendung von Implodieren und Explodieren, die sicherer, aber nicht optimal ist!

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

Mein Vorschlag ist, eine native for-Schleife oder Regex zu verwenden, um diese Art von Arbeit zu erledigen.

Amir Fo
quelle
Dadurch werden mehrere Leerzeichen nicht korrekt konvertiert, wenn das Leerzeichen länger als zwei Leerzeichen ist.
Mikeybeck
1

Um Sandips Antwort zu erweitern, wurden in den Protokollen einige Zeichenfolgen angezeigt, die in bit.ly falsch codiert waren. Sie wollten nur die URL codieren, aber nach einem Leerzeichen ein Twitter-Handle und einige andere Dinge einfügen. Es sah so aus

? productID =26%20via%20@LFS

Normalerweise wäre das kein Problem, aber ich bekomme viele SQL-Injection-Versuche, daher leite ich alles, was keine gültige ID ist, auf eine 404 um. Ich habe die Methode preg_replace verwendet, um die ungültige productID-Zeichenfolge in eine zu verwandeln gültige Produkt-ID.

$productID=preg_replace('/[\s]+.*/','',$productID);

Ich suche nach einem Leerzeichen in der URL und entferne dann alles danach.

JScarry
quelle
0

Ich habe kürzlich eine einfache Funktion geschrieben, die überschüssigen Leerraum ohne regulären Ausdruck aus dem String entfernt implode(' ', array_filter(explode(' ', $str))).

Zsolt Oroszlány
quelle
-1
$str = "I      am a PHP   Developer";
$str_length = strlen($str);
$str_arr = str_split($str);
for ($i = 0; $i < $str_length; $i++) {
   if (isset($str_arr[$i + 1])  && $str_arr[$i] == ' ' && $str_arr[$i] == $str_arr[$i + 1]) {
       unset($str_arr[$i]);
   } 
   else {
     continue;
   }
}
echo implode("", $str_arr);
Shahbaz Khan
quelle