Regulärer Ausdruck mit optionalem Inahlt
Michael Richter
- php
hallo community
ich hab ein problem, das richtige suchmuster zu erstellen um einen bestimmten string zu durchsuchen
also erstmal der teil um den es geht:
----------------------
Wert1: 12:34:56
Wert2: bla bla bla
Wert3: [xyz]
Wert4: 1234
----------------------
dieser teil kommt 0-16 mal auf im kompletten string vor
was ich bisher als suchmuster mit preg_match_all() benutzt habe:
/Wert1: ([0-9]+):([0-9]+):([0-9]+)\nWert2: (.*?)\nWert3: [(.*?)]\nWert4: ([0-9]+)/
das funktioniert auch soweit
das problem ist, dass Wert3 optional ist und nicht immer vorkommt und wenn der fehlt, dann findet die funktion diesen eintrag nicht
also wie muss ich das suchmuster verändern, damit Wert3 optional gilt?
mfg
Michael
Hi Michael Richter,
also wie muss ich das suchmuster verändern, damit Wert3 optional gilt?
[xyz]* für IMHO dazu, dass er null oder mehrmals da sein darf, ansonsten
[xyz]{0,}
MfG, Dennis.
[xyz]* für IMHO dazu, dass er null oder mehrmals da sein darf, ansonsten
[xyz]{0,}
ne also, wie ich das meine:
entweder steht da:
Wert1: 12:34:56
Wert2: bla bla bla
Wert3: [xyz]
Wert4: 1234
oder:
Wert1: 12:34:56
Wert2: bla bla bla
Wert4: 1234
Hi Michael Richter,
entweder steht da:
Wert1: 12:34:56
Wert2: bla bla bla
Wert3: [xyz]
Wert4: 1234oder:
Wert1: 12:34:56
Wert2: bla bla bla
Wert4: 1234
Richtig, im Endeffekt steht da also:
Wert1: 12:34:56
Wert2: bla bla bla
(Wert3: [xyz])
Wert4: 1234
Wert 3 in Klammer geschrieben, weil nicht immer da.
Das ist doch das gleiche, wie wenn ich schreibe:
1mal Wert1: 12:34:56
1mal Wert2: bla bla bla
0mal oder 1mal Wert3: [xyz]
1mal Wert4: 1234
Und wenn man dann den Wert 3 mit [xyz]{0,1} überprüft, darf dieser genau 0 mal (minimum) oder 1 mal (maximum) da sein.
Das ist eigentlich genau, was du willst.
MfG, Dennis.
Und wenn man dann den Wert 3 mit [xyz]{0,1} überprüft, darf dieser genau 0 mal (minimum) oder 1 mal (maximum) da sein.
ja, mir ist das schon klar aber das geht nicht so einfach, das ist ja das problem
du kannst ja gern mal versuchen den suchpattern umzubauen, damit das dann richtig ist, ich habs nämlich nicht geschafft, da liegt der hund begraben (oder wie war dieser spruch :)
Hi Michael Richter,
ja, mir ist das schon klar aber das geht nicht so einfach, das ist ja das problem
du kannst ja gern mal versuchen den suchpattern umzubauen, damit das dann richtig ist, ich habs nämlich nicht geschafft, da liegt der hund begraben (oder wie war dieser spruch :)
Das ist dein RegEx nehme ich an?
/Wert1: ([0-9]+):([0-9]+):([0-9]+)\nWert2: (.*?)\nWert3: [(.*?)]\nWert4: ([0-9]+)/
Dann probier doch mal:
/Wert1: ([0-9]+):([0-9]+):([0-9]+)\nWert2: (.*?)\n(Wert3: )*[(.*?)]*\nWert4: ([0-9]+)/
Btw: Ich bin mir nicht ganz sicher, ob man * oder + verwenden muss.
Eins steht für 0 mal oder öfter und eins für 1 mal oder öfter.
MfG, Dennis.
Hallo Dennis,
Btw: Ich bin mir nicht ganz sicher, ob man * oder + verwenden muss.
Eins steht für 0 mal oder öfter und eins für 1 mal oder öfter.
'*' bedeutet 0-mal oder öfter, '+' 1-mal oder öfter und '?' 0-mal oder 1-mal.
Grüße aus Nürnberg
Tobias
Hi Tobias,
'*' bedeutet 0-mal oder öfter, '+' 1-mal oder öfter und '?' 0-mal oder 1-mal.
Danke, das hatte ich vergessen.
Mein RegEx oben müsste doch eigentlich funktionieren, oder?
MfG, Dennis.
Huhu Michael
was ich bisher als suchmuster mit preg_match_all() benutzt habe:
/Wert1: ([0-9]+):([0-9]+):([0-9]+)\nWert2: (.*?)\nWert3: [(.*?)]\nWert4: ([0-9]+)/
das funktioniert auch soweit
das problem ist, dass Wert3 optional ist und nicht immer vorkommt und wenn der fehlt, dann findet die funktion diesen eintrag nichtalso wie muss ich das suchmuster verändern, damit Wert3 optional gilt?
Du könntest Dein Muster allgemeiner formulieren z.B. so
$reg_exp = '#Wert([0-9]+): (.*)$#m';
$success = preg_match_all($reg_exp, $snipp, $matches);
siehe dazu
http://www.php.net/manual/en/pcre.pattern.modifiers.php
http://www.php.net/manual/en/function.preg-match-all.php
Viele Grüße
lulu
$reg_exp = '#Wert([0-9]+): (.*)$#m';
$success = preg_match_all($reg_exp, $snipp, $matches);
dann finde ich zwar alle werte aber ich weiß nicht, welcher wert wozu gehört (oder?)
denn die gruppen gehören zu einem datensatz, kann man sagen
wie gesagt, der ganze block, mit den 4 werten kommt bis zu 16 mal vor und die 4 werte (oder eben 3, wenn wert3 fehlt) gehören immer zusammen
hi,
denn die gruppen gehören zu einem datensatz, kann man sagen
wie gesagt, der ganze block, mit den 4 werten kommt bis zu 16 mal vor und die 4 werte (oder eben 3, wenn wert3 fehlt) gehören immer zusammen
dann bilden also vier _zeilen_ jeweils einen zusammengehörigen datensatz?
dann findest du die doch zusammengehörend, wenn du dazwischen im muster einen zeilenumbruch verlangst.
gruß,
wahsaga
Hallo Michael,
Wert1: 12:34:56
Wert2: bla bla bla
Wert3: [xyz]
Wert4: 1234
was ich bisher als suchmuster mit preg_match_all() benutzt habe:
/Wert1: ([0-9]+):([0-9]+):([0-9]+)\nWert2: (.*?)\nWert3: [(.*?)]\nWert4: ([0-9]+)/
das problem ist, dass Wert3 optional ist und nicht immer vorkommt und wenn der fehlt, dann findet die funktion diesen eintrag nicht
Du kannst um Wert3: [(.*?)]\n eine Klammer setzen und mit ? optional (kein- oder einmal) machen. Damit die zusätzliche Klammer nicht gespeichert wird, solltest Du sie mit (?: beginnen lassen.
Ich habe aber nicht weiter überlegt, ob man den Ausdruck nicht auch ganz anders formulieren könnte. :)
Gruß Alex