PHP Text zu Array von Wörter & Nichtwörter

xliq

Cadet 1st Year
Registriert
März 2016
Beiträge
10
Hallo zusammen,

ich möchte einen langen Text in einen Array umwandeln. Dieser Array umfasst sowohl die einzelne Wörter als auch Zeichen wie Leerzeichen, Komma sowie alle mögliche Zeichen.

Beispiel:

Input: Dies ist ein Text, mit unterschiedlichen Zeichen wie @,":.

Output:

array(24)
(
[0] => string(4) "Dies"
[1] => string(1) " "
[2] => string(3) "ist "
[3] => string(1) " "
[4] => string(3) "ein"
[5] => string(1) " "
[6] => string(4) "Text"
[7] => string(1) ","
[8] => string(1) " "
[9] => string(3) "mit"
[10] => string(1) " "
[11] => string(1) " "
[12] => string(1) " "
[13] => string(17) "unterschiedlichen"
[14] => string(1) " "
[15] => string(7) "Zeichen"
[16] => string(1) " "
[17] => string(3) "wie"
[18] => string(1) " "
[19] => string(1) "@"
[20] => string(1) ","
[21] => string(1) """
[22] => string(1) ":"
[23] => string(1) "."
)

Die Nichtwörter müssen nicht als einzelnes Element im Array sein, z.B. können auch mehrere Leerzeichen wie " " als ein Element zusammengefasst werden. Je nach welche Umsetzung einfacher ist :)

Ich hab bereits mit explode(), strtok(), preg_split(), preg_match() probiert, allerdings konnte ich bis jetzt keinen Array wie oben dargestellt erstellen.
 
PHP:
<?php

$str = "Dies ist ein Text, mit   unterschiedlichen Zeichen wie @,\":.";

preg_match_all("@(\\w+|.)@sim", $str, $m);

echo "<pre>";
var_dump($m[1]);

?>
 
wow nice, danke! :D

Regex muss ich noch richtig lernen :)

Ich hatte vergessen, paar multibyte Strings wie ä ö ü ins Beispiel reinzunehmen.

Wie muss man den regex anpassen, damit auch nicht englische Wörter semantisch korrekt getrennt werden?
 
fueg zu den regex-flags noch ein "u" hinzu.

naja, und statt \w kannst du auch \p{L} probieren.
 
Zuletzt bearbeitet:
bog schrieb:
PHP:
<?php
  ...
  preg_match_all("@(\\w+|.)@sim", $str, $m);
   ...
?>

Hmm, sieht irgendwie zu kompliziert aus. Würde bei Umlauten versagen (fehlendes /u) und ist etwas zu redundant. Ich würde vielleicht sowas vorschlagen:
Code:
   ...
    preg_match_all('/\p{L}+|\W/u', $str, $m);
    var_dump($m[0]);
   ...
 
Zuletzt bearbeitet:
again what learned - \p{L} kannte ich noch nicht, ist aber sehr praktisch, um zw. Buchstaben & Ziffern (\p{N})zu unterscheiden
Danke!
Ergänzung ()

blöderidiot schrieb:
Hmm, sieht irgendwie zu kompliziert aus. Würde bei Umlauten versagen (fehlendes /u) und ist etwas zu redundant. Ich würde vielleicht sowas vorschlagen:
Code:
   ...
    preg_match_all('/\p{L}+|\W/u', $str, $m);
    var_dump($m[0]);
   ...

das läßt aber Ziffern außen vor; wenn die im Text vorkommen, werden die ignoriert
 
rumbalotte schrieb:
das läßt aber Ziffern außen vor; wenn die im Text vorkommen, werden die ignoriert

Stimmt. Aber der OP hat nicht spezifiziert, ob sie vorkommen und was das dann sein soll. So:
Code:
preg_match_all('/\p{L}+|./u', $str, $m);
würden Zahlen "einzeln" im Array abgelegt und so:
Code:
    preg_match_all('/\p{L}+|\p{N}+|./u', $str, $m);
dann als Sequenz.
 
Vielen Dank für die Beispiele. Was mit den Zahlen passieren sollen weiß ich auch nicht. Aber nun stehen da genug Beispiele für all mögliche Fälle. :)

Regex ist wirklich sehr mächtig, jedoch fiel es mir immer schwer, Regex systematisch zu lernen. Wie lernt man Regex am besten? :)
 
Zurück
Oben