Hallo,
leider bin ich in Sachen Regexp nicht sonderlich fit.
Ich suche eine Regex die mir Strings nach dem folgenden Muster außereinander nimmt.string/int_string/int_"/'string/int"/'
Also das heißt ich habe beliebig viele Zeichenketten zwischen beliebig vielen Leerzeichen wenn aber ein String in " oder ' steht soll er auch wenn leerzeichen dazugehören als einer erkannt werden, diesem String sollten dann " oder ' maskierbar sein also '
Beispiel
copy abc de fghi "Test Test "Test" Test 'Test' Test" 'Test'
Sollte dann folgendes geben:
Array (
0 => copy
1 => abc
2 => de
3 => fghi
4 => Test Test "Test" Test 'Test' Test
5 => Test
)Kann mir da jemand helfen ;-) ?
Ok das ist kein leichtgewichtiger Keks.
Ich komme von perl her, und versuche mal einen Ansatz.
/"([^"]+)"/ findet leider \
ergo darf man " nur dann matchen, wenn es kein \ vorangeht
Da wir es mit Tokens zu tun haben
Token "Token Pair" Token
kann ich schon mal die Bdingung knüpfen, dass dem einleitenden " ein Whitespace oder der Starpunkt des Suchstrings vorangehen muss.
/(?:^|\s+)"(.+)"/
Das matcht nun aber immer noch.
Ich kann noch die Bedingung anknüpfen, dass dem End " kein \ vorangehen darf
/(?:^|\s+)"(.*?[^\"])"/
die Gleiche Version mit '
/(?:^|\s+)'(.*?[^\'])'/
Und natürlich sollen Tokens gefunden werden, die für die gilt:
[^\s"']+
/(?:^|\s+)([^\s"'][^\s]*)/
Jetzt setzen wir das zusammen
/(?:^|\s+)([^\s"'][^\s]*)|(?:^|\s+)"(.*?[^\"])"|(?:^|\s+)'(.*?[^\'])'/
Aufpassen muss man hier, dass das gewünschte Resultat entweder in $1, $2 oder $3 drin ist
Wir konnen noch etwas ausfaktorieren:
/(?:^|\s+)
(?:
([^\s"'][^\s]*)
|
"(.*?[^\"])"
|
'(.*?[^\'])'
)
(?:\s+|$)
/x
Und hier das finale perlscript
#!C:/Programme/Perl/bin/perl.exe -w
#
use strict;
BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">>error.txt") or die "Unable to append to error.txt: $!\n";
carpout(*LOG);
}
my $s=q(a bc def "ghi jkl \"m\" n \'o\' p" 'q');
while( $s =~ s/
(?:^|\s+)
(?:
([^\s"'][^\s]*)
|
"(.*[^\\"])"
|
'(.*[^\\'])'
)
(?:\s+|$)
//x){
print $1.$2.$3, "\n";
}
sleep(10);
exit;
__END__
Sollte weiter getestet werden.
Nach PHP umschreiben bleibt eine Übung für den Fragesteller.
mfg Beat