preg_split - "Splitinformationen" nicht verwerfen
Rafael
- php
Hallo Forum,
ich stehe vor einem Problem, dass eigentlich banal zu lösen sein müsste.
Ich habe eine Text-Datei mit einem wie folgt strukturierten Inhalt:
"BEZEICHNUNG weiterer text und sonderzeichen BEZEICHNUNG weiterer text und sonderzeichen BEZEICHNUNG weiterer text und sonderzeichen BEZEICHNUNG weiterer text und sonderzeichen (...)"
Die Inhalte sind natürlich jeweils anders. Nun will ich einen String mit einem Array wie folgt:
1 => 'BEZEICHNUNG weiterer text und sonderzeichen'
2 => 'BEZEICHNUNG weiterer text und sonderzeichen'
...
Wenn ich nun mit preg_split('/[A-Za-z]+ [A-Z]+/, $string); teile ergibt das natürlich Mist. Ich versuche mich gerade an regulären Ausdrücken sowie an PHP und komme leider nicht weiter, weshalb ich mal hier nachfragen wollte, ob man mir weiterhelfen kann. Für Tipps sowie Lösungen bin ich jederzeit dankbar! Liebe Grüße, Rafael
Hi,
"BEZEICHNUNG weiterer text und sonderzeichen BEZEICHNUNG weiterer text und sonderzeichen BEZEICHNUNG weiterer text und sonderzeichen BEZEICHNUNG weiterer text und sonderzeichen (...)"
Die Inhalte sind natürlich jeweils anders. Nun will ich einen String mit einem Array wie folgt:
Und *was* "willst du ihn"?
1 => 'BEZEICHNUNG weiterer text und sonderzeichen'
2 => 'BEZEICHNUNG weiterer text und sonderzeichen'
...
Beschreibe zunächst möglichst genau verbal, nach welcher Vorschrift gesplittet werden soll. Das ist für *deine* Analyse des Problems einer der wesentlichsten Schritte.
Wenn ich nun mit preg_split('/[A-Za-z]+ [A-Z]+/, $string); teile ergibt das natürlich Mist.
Dann definiere erst mal exakt, wie "nicht Mist" aussehen soll, siehe oben.
MfG ChrisB
Achso, verzeihung, ich dachte, dass sei ersichtlich. Ich habe immer ein bis zwei Wörter komplett in Großbuchstaben und dann einige Wörter bzw. Zahlen in normaler Groß-/Kleinschreibung. Das ist die einzige Struktur in der Datei und entsprechend wünsche ich mir eine Aufteilung.
Hi,
Ich habe immer ein bis zwei Wörter komplett in Großbuchstaben und dann einige Wörter bzw. Zahlen in normaler Groß-/Kleinschreibung. Das ist die einzige Struktur in der Datei und entsprechend wünsche ich mir eine Aufteilung.
Na dann wäre preg_match(_all) aber vielleicht geeigneter für dich, denn du willst du Worte ja auch "behalten", und nicht als blosse Trenner betrachten und demzufolge wegwerfen.
MfG ChrisB
Vielen Dank! preg_match ist tatsächlich das bessere Verfahren, ich hatte mich so auf das Trennen fixiert, dass ich die Funktion übersehen habe. Trotzdem noch eine Frage, nun zu regulären Ausdrücken:
Ich habe nun folgendes Pattern: "/[A-Z]{3}[A-Z]?[A-Za-z0-9.-,:&" ]+/"
Wonach ich also "Trennen" will, ist mindestens drei Großbuchstaben in folge, dann noch beliebig viele Großbuchstaben, aber sobald dies nicht mehr erfüllt ist, alles andere, bis wieder drei Großbuchstaben in folge kommen. Nun ist mein Problem aber, dass letzter Ausdruck den Rest der Textdatei mit einliest, da ich Probleme habe, zu formulieren, dass in der letzten Klammer alles vorkommen darf, außer drei (oder mehr) Großbuchstaben in Folge. Kann mir hier jemand helfen?
Hi,
ich stehe vor einem Problem, dass eigentlich banal zu lösen sein müsste.
Ich habe eine Text-Datei mit einem wie folgt strukturierten Inhalt:"BEZEICHNUNG weiterer text und sonderzeichen BEZEICHNUNG weiterer text und sonderzeichen BEZEICHNUNG weiterer text und sonderzeichen BEZEICHNUNG weiterer text und sonderzeichen (...)"
Die Inhalte sind natürlich jeweils anders. Nun will ich einen String mit einem Array wie folgt:
1 => 'BEZEICHNUNG weiterer text und sonderzeichen'
2 => 'BEZEICHNUNG weiterer text und sonderzeichen'
Es gibt 2 offensichtliche Möglichkeiten:
1. Der vom RE gematchte Delimiter muß kein Zeichen sein, es reicht, wenn es eine Position ist.
2. preg_split erlaubt es, auch die Delimiter zurückzugeben (allerdings muß dazu auch die maximale Anzahl der Teile angegeben werden - int_max sollte aber gehen)
zu 1:
<?php
$string = "ABC d ef GHI jkl MNO pqr STU vwx yz abc";
$split = preg_split("/(?<=.)\b(?=(?:[A-Z]+\s+)+)/", $string);
echo $string."\n";
print_r($split);
?>
ergibt:
ABC d ef GHI jkl MNO pqr STU vwx yz abc
Array
(
[0] => ABC d ef
[1] => GHI jkl
[2] => MNO pqr
[3] => STU vwx yz abc
)
Zum Ausdruck /(?<=.)\b(?=(?:[A-Z]+\s+)+)/
(?<=.)
vor der Trennstelle muß mindestens ein Zeichen sein.
Ohne diesen RE-Teil ist der erste Split an Position 0, sprich: der erste Teil ist leer, die anderen wie gehabt.
\b es soll an einer Wortgrenze geteilt werden.
(?=(?:[A-Z]+\s+)+) Nach der Trennposition soll mindestens ein großgeschriebenes Wort stehen.
(keine Garantie auf Richtigkeit/Vollständigkeit der Lösung)
cu,
Andreas
Hallo Andreas,
vielen Dank für deine Lösung! Dein erster Vorschlag ($split = preg_split("/(?<=.)\b(?=(?:[A-Z]+\s+)+)/", $string);) klappt für meine Zwecke hervorragend. Nur eine Bitte hätte ich noch: Ich habe eben versucht, dein Pattern selbst zu modifizieren, aber ich verstehe deinen Ausdruck nicht besonders gut, weshalb nichts Brauchbares dabei herauskommt, wenn ich selbst umbaue: Wenn ich nun (später in der Datei) Kombinationen im Sinne von
BEZEICHNUNG IN VERSCHIEDENEN WOERTERN weiterer text und sonderzeichen
entgegen stehe, wird dieser Teil in zu viele Zeilen aufgeteilt. Ich hatte gerade selbst nicht bemerkt, dass solche Kombis auftreten, sonst hätte ich es schon erwähnt. Die Regel müsste also heißen, beliebig vielen Großbuchstaben inklusive ab und zu zusätzliche Leerzeichen. Danke schon einmal! Liebe Grüße, Rafael