| 

.NET C# Java Javascript Exception

1
Hallo!

Ich bin mit PHP gerade am schnitzen und bräuchte eine Regulären Ausdruck der mir folgenden String zerlegt:

"test1 test2 nicht test3 nicht test4 test5 not test 6"

Ich möchte das alle Wörter nach dem nicht oder not gefunden werden.

Bei diesem Beispiel-String (der auch umlaute enthalten könnte):
"test1 test2 nicht test3 nicht test4 test5 not test 6"

Erwarte ich mir z.b. folgendes Ergebnis:
Array
(
(0) => test3
(1) => test4 test5
(2) => test6
)


Hat jemand ein paar Vorschläge für mich, ich hab jetzt schon viel gelesen, aber leider bekomme ich es nicht so hin wie ich es benötigen würde.

Danke!
10.09.2009
BiX 149 1 5
BiX 149 1 5
hi, wenn Dein Ergebnis richtig ist, verstehe ich die Regel nicht.. wäre nicht test2, test3 und test5 die vollständige Menge?
Woboroz 10.09.2009
1
Nein, er will NUR teilstrings herausholen, die NACH dem ERSTEN not oder nicht stehen und alle nach weiteren not oder nicht.
Dustin Klein 10.09.2009
6 Antworten
3
Zusammengefasst sieht die Lösung dann so aus:
$str = "test1 test2 nicht test3 nicht test4 test5 not test 6";
$array = preg_split("/ (not|nicht) /", $str, -1, PREG_SPLIT_NO_EMPTY);
array_shift( $array );
print_r( $array );

das Ergebnis ist dann:
Array
(
[0] => test3
[1] => test4 test5
[2] => test 6
)

Das passt zwar nicht zur Fragestellung "alle Wörter nach dem nicht oder not" (da wäre das test5 nicht dabei), entspricht aber Deinen genannten Erwartungen.
Grüße
10.09.2009
Woboroz 76 1 2
1
test5 ist ja ebenso ein wort nach einem not oder nicht, nur eben als verbund mit test4, da ja "not 'test4 test5'" in ein Array Element rutschen.
Dustin Klein 10.09.2009
1
Ich denke, daß das interpretierbar ist.
Genau genommen steht test5 nicht direkt hinter einem nicht oder not, sondern nur indirekt.
Die "richtige" Lösung hängt also davon ab, ob man nur die direkten Wörter, oder auch alle indirekten Wörter haben will.
lunatigs 10.09.2009
3
Hallo Bix,

da noch keine Antworten zur eigentlichen Frage kamen
("mit regulärem Ausdruck") möchte ich diesen hin-
zufügen.

Es ist eigentlich ganz einfach, man kann Deine
Bedingungen fast wörtlich in den Regex schreiben:
...
preg_match_all('/
(?:not|nicht) # vorne soll "not,nicht" stehen,
(.+?) # dann kann stehen was will,
(?=not|nicht|$) # bis irgendwann "not,nicht,ende" kommt
/x',
$string,
$matches
);
...

Die Resultate sind dann wie üblich
in matches[1] zu finden.

Der "Trick" an der Sache ist die Ver-
wendung des 'positive lookahead' "?="

Viele Grüße
11.09.2009
Damengummistiefel 377 1 6
2
Ich würde dir empfehlen preg_split zu benutzen, da dies noch einen weiteren (meiner Meinung nach recht wichtigen) Parameter zulässt und ebenfalls regular expressions beherrscht:

$array = preg_split(" (not|nicht)", $zeichenkette, -1, PREG_SPLIT_NO_EMPTY)


Was die zusätzlichen Parameter (-1 und PREG_SPLIT_NOT_EMPTY) bedeuten kannst du hier nochmal genauer in Erfahrung bringen: preg_split


// EDIT:
Da du ja nur die Ergebnisse nach deinem ersten Vorkommen von "not" oder "nicht" haben möchtest, kannst du entweder das erste Element des Arrays verwerfen:

array_shift($array)


oder du führst das Ganze in zwei Suchetappen aus (was ich für nicht wirklich schön halte):

$array1 = preg_split("^*(not|nicht) ", $zeichenkette, 1, PREG_SPLIT_NO_EMPTY)
$array2 = preg_split(" (not|nicht) ", $array1, -1, PREG_SPLIT_NO_EMPTY)


PS: Ich bin PHP Laie, also erwartet nicht zu viel :P
10.09.2009
Dustin Klein 2,9k 2 9
0
ersetzte doch einfach jedes " nicht " durch " not " (inkl. leerzeichen) und dann jagst du die funktion split drüber...

$array = split ( ' not ', $zeichenkette);


den ersten eintrag müsstest du dann natürlich weglassen...
10.09.2009
licht_micha 364 1 3
dann würde aber auch test4 von test5 getrennt werden
MiW 10.09.2009
Solang Du nur so einfache Sachen wie not nimmst, reicht auch ein $array = explode(' not ',$zeichenkette);
split ist natürlich schöner, wenn Du irgendwann mal reguläre Ausdrücke mit reinnehmen willst.
lunatigs 10.09.2009
1
Reguläre Ausdrücke sind sowas von dermaßen überbewertet, das geht auf keine Kuhhaut.
Bombe 10.09.2009
1
Finde nicht, dass regex überbewertet sind. Halte sie für sehr sinnvoll und sie erleichtern die Arbeit enorm, wenn man sich die Mühe macht regex zu verstehen :)
Dustin Klein 10.09.2009
Das hängt ja wohl mal stark davon ab, zu was man sie nutzt. In diesem Fall ist es wohl mit Kanonen auf Spatzen scheißen. In vielen Fällen erspart einem RexEx aber ne Menge Arbeit.
lunatigs 10.09.2009
1
Hi, erstmal danke, nur wenn ich es so splitte oder explode habe ich als ersten key/value im Array "test1 test2", was aber nicht richtig ist.

Denn ich will alle Wörter nach einem NICHT oder NOT und nicht die Wörter die davor sind im Array.

Deswegen wollte ich Regular Expressions verwenden, die Funktion explode oder Split sind mir nicht unbekannt, helfen mir in diesem Fall aber nicht wirklich. :(
BiX 10.09.2009
Was spricht denn dagegen nach dem split bzw. explode das erste Array-Element einfach rauszuschmeissen? -> array_shift($array);
-armin- 10.09.2009
1
Gar nichts armin, es hätte mir nur einfach besser gefallen wenn von Haus aus gleich die richtigen Werte drinnen stehen ohne das ich irgend was rausputzen muss.
BiX 10.09.2009
1
Ahhh, du bist wohl auch so ein Perfektionist bei dem der code "most elegant" sein muss? Geht mir ähnlich ;o)
-armin- 10.09.2009
0
wieso nicht einfach

$array = split ( ' (nicht|not) ', $zeichenkette);


der erste parameter ist doch ein pattern oder nicht? Dann sollte das so passen.
10.09.2009
Vayu 656 1 3
0
oder
$arr = split('nicht|not',$str); unset($arr[0]);
10.09.2009
MiW 1,0k 1 8
unset($arr[0]); halte ich an der Stelle für falsch. Damit finge dann das Array bei 1 an und nicht bei 0, wenn ich das richtig sehe. Daher wär ein array_shift($arr); wohl besser. Korrigiert mich, wenn ich da falsch liege :)
lunatigs 10.09.2009
ist es schlimm wenn ein array mit 1 anfängt ?
ich benutze gerne assoziative Arrays, die fangen dann gerne mal mit was ganz anderem an.
MiW 10.09.2009
Schlimm ist das nur, wenn Du z.B. das Array numerisch in einer Schleife durchgehst, die bei 0 startet.
Da das Array in der Frage eindeutig numerischer Natur ist, hab ich gedacht ich erwähn das mal besser, wenngleich man das auch assoziativ handhaben könnte.
lunatigs 10.09.2009
Da hast Du wohl Recht. Ich nehme immer foreach
MiW 10.09.2009
Würde auch zu einem foreach raten. Generell bin ich aber auch dafür natürliche Arrays zu benutzen, die generell bei 0 anfangen. Ansonsten muss sehr gut dokumentiert werden, wo das Array beginnt und wieso!

Generell ist das Problem aber durch ein foreach gelöst ;)
Dustin Klein 10.09.2009
Ich benutze Arrays eher als eine Art Collection und greife selten seriell darauf zu. Es sei denn ich nutze sie als queue oder stack aber dann sind die indizes ja auch wurscht, wenn man mit push und pop arbeitet.
MiW 11.09.2009

Stelle deine Php-Frage jetzt!