Wie kann ich Leerzeichen explodieren und kürzen?

167

Zum Beispiel möchte ich ein Array aus den Elementen in dieser Zeichenfolge erstellen:

$str = 'red,     green,     blue ,orange';

Ich weiß, dass du explodieren und sie durchschleifen und trimmen kannst:

$arr = explode(',', $str);
foreach ($arr as $value) {
    $new_arr[] = trim($value);
}

Aber ich habe das Gefühl, dass es einen einzeiligen Ansatz gibt, der damit umgehen kann. Irgendwelche Ideen?

SeanWM
quelle

Antworten:

449

Mit array_map können Sie Folgendes tun :

$new_arr = array_map('trim', explode(',', $str));
SeanWM
quelle
10
Dies ist auch eine Schleife (intern) von PHP
Jason OOO
2
Dies ... rettete ... mein ... Leben ... Ich habe versucht, eine Datei über fseek zu manipulieren, um sie an das Ende einer Datei anzuhängen ... als ich mich entschied, sie in ein Array zu zerlegen und neu zu schreiben In der Datei habe ich gesehen, dass die ganze Zeit über zusätzliche Leerzeichen hinzugefügt wurden ... diese + Implodierung hat mein verdammtes Leben gerettet. Ich kann jetzt essen gehen.
jenki221
4
@JasonOOO Ich denke, nach Meinung der meisten Leute sind ein paar Millisekunden (wenn auch nur das) ein fairer Kompromiss für eine kurze, einfache und leicht lesbare Codezeile.
Gavin
Einfach und leicht zu verstehen. Wenn es sich jedoch um große Datenmengen handelt, ist die leistungsfähigere Antwort von @ amr-eladwy die bessere Lösung.
Yaron
Ich liebe diesen Code und komme ab und zu auf diese Seite zurück!
Patrickzzz
51

Eine verbesserte Antwort

preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red,     green thing ,,  ,,   blue ,orange');

Ergebnis:

Array
(
    [0] => red
    [1] => green thing
    [2] => blue
    [3] => orange
)

Dies

  • Wird nur durch Kommas geteilt
  • Schneidet Leerzeichen von jedem Element ab.
  • Ignoriert leere Elemente
  • Teilt einen Gegenstand nicht mit Innenräumen wie "grünes Ding"
Amr ElAdawy
quelle
7
Kann mir jemand erklären, warum diese Antwort nicht 100 positive Stimmen hat? Regexp ist schwer zu verstehen, aber es analysierte meine 100-MB-Datei schneller als andere Lösungen
Dan
2
Ich bin froh, dass Sie es hilfreich fanden. Ich las alle Antworten und kam mit einer besseren Mischung. Die Regex kann im Detail erklärt werden.
Amr ElAdawy
2
Sorry , aber diese regex ist falsch - versuchen zu ersetzen redmit *red*. Ein besserer könnte / (\ s *, \ s *) + /
Greg
@AmrElAdawy FYI dies funktioniert nach dem 28.08. Update nicht mehr. Wenn der reguläre Ausdruck in der Antwort unverändert ist, wird der Leerraum von einigen Elementen nicht abgeschnitten. Bsp.: "Grünes Ding".
Samsquanch
1
@ Samsquanch aktualisiert. Bitte lassen Sie mich wissen, wenn Sie ein Problem sehen.
Amr ElAdawy
25

Im Folgenden werden auch Leerzeichen am Anfang / Ende der Eingabezeichenfolge berücksichtigt:

$new_arr = preg_split('/\s*,\s*/', trim($str));

und dies ist ein minimaler Test mit Leerzeichen in jeder vernünftigen Position:

$str = ' first , second , third , fourth, fifth ';
$new_arr = preg_split('/\s*,\s*/', trim($str));
var_export($str);
Diego Perini
quelle
array_mapKann jemand seine Leistung vergleichen, da und Regexp-Lösungen identische Ergebnisse liefern?
Dan
@ Dan In solchen Fällen wird es keinen Unterschied geben.
Aris
4

So ersetzen und explodieren Sie in einer einzigen Codezeile

$str = 'red,     green,     blue ,orange';

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

gibt die Ergebnisse als aus

Array
(
    [0] => red
    [1] => green
    [2] => blue
    [3] => orange
)
Amit Sharma
quelle
3

Durch die Kombination einiger der Prinzipien in den vorhandenen Antworten kam ich auf

preg_split ('/\s*,+\s*/', 'red,     green thing ,,  ,,   blue ,orange', NULL, PREG_SPLIT_NO_EMPTY);

Der Grund dafür ist, dass ich in dieser Antwort einen Fehler gefunden habe. Wenn am Ende der Zeichenfolge ein Komma steht, wird ein leeres Element im Array zurückgegeben. dh

preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red,     green thing ,,  ,,   blue ,orange,');

Ergebnisse in

Array
(
  [0] => red
  [1] => green thing
  [2] => blue
  [3] => orange
  [4] => ''
)

Sie können dies beheben, indem Sie PREG_SPLIT_NO_EMPTY wie in dieser Antwort erwähnt verwenden , um es zu entfernen. Wenn Sie dies jedoch tun, müssen Sie technisch keine aufeinander folgenden Kommas über den regulären Ausdruck entfernen, daher der verkürzte Ausdruck

shmurf
quelle
2

Sie können dies auch mit einem einzeiligen regulären Ausdruck tun

preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);
Dom
quelle
1

Versuche dies:

$str = preg_replace("/\s*,\s*/", ",", 'red,     green,     blue ,orange');
Jason OOO
quelle
Das OP möchte ein Array. preg_replace()generiert kein Array aus einem String. Dies ist die richtige Antwort auf die falsche Frage. Abgestimmt.
Mickmackusa
1
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange');geringfügige Änderung rehabilitiert die Antwort
dreftymac
1

SPEZIFISCH für die Beispielzeichenfolge des OP können Sie str_word_count () verwenden , da jeder zuzuordnende Teilstring ein einzelnes Wort ist .

Code: ( Demo )

$str = ' red,     green,     blue ,orange ';
var_export(str_word_count($str,1));  // 1 means return all words in an indexed array

Ausgabe:

array (
  0 => 'red',
  1 => 'green',
  2 => 'blue',
  3 => 'orange',
)

Dies kann auch für Teilzeichenfolgen angepasst werden, die über Buchstaben hinausgehen (und einige Bindestriche und Apostrophe - wenn Sie das Kleingedruckte lesen), indem die erforderlichen Zeichen zur Zeichenmaske / zum dritten Parameter hinzugefügt werden.

Code: ( Demo )

$str = " , Number1 ,     234,     0 ,4heaven's-sake  ,  ";
var_export(str_word_count($str,1,'0..9'));

Ausgabe:

array (
  0 => 'Number1',
  1 => '234',
  2 => '0',
  3 => '4heaven\'s-sake',
)

Auch hier behandle ich diese Frage aufgrund der Beispielzeichenfolge sehr eng, aber dies liefert die gleiche gewünschte Ausgabe:

Code: ( Demo )

$str = ' red,     green,     blue ,orange ';
var_export(preg_match_all('/[^, ]+/',$str,$out)?$out[0]:'fail');
mickmackusa
quelle
0

Sie können dafür preg_split () verwenden .

$bar = preg_split ('/[,\s]+/', $str);
print_r ($bar);

/* Result:
  Array
  (
      [0] => red
      [1] => green
      [2] => blue
      [3] => orange
  )
 */
Sutandiono
quelle
Das wird auf Leerzeichen in Ihren Elementen aufgeteilt
Chris KL
Bewegen Sie das Komma links von eckigen Klammern, um das gewünschte Komma zu erhalten.
Eric Leschinski
Wenn Sie das Komma nach links verschieben, wird das nicht gelöst. Bitte überprüfen Sie meine Antwort unten stackoverflow.com/a/38300330/5079380
Amr ElAdawy
-4
$str = str_replace(" ","", $str);
Schwarz-Weiss
quelle
4
Trimmen macht mehr als das ... Es \t\n\r\0\x0B
schneidet
3
Nicht nur das, sondern dies wird Elemente mit Platz vermasseln.
Adam Kiss
-11

trimmen und explodieren

$ str = 'rot, grün, blau, orange';

$ str = trim ($ str);

$ strArray = explodieren (',', $ str);

print_r ($ strArray);

Anil M Saini
quelle
5
Dadurch werden nur Leerzeichen vom Anfang und Ende einer Zeichenfolge entfernt, nicht zwischen den einzelnen Farben.
SeanWM