PCRE-Regex liefert komisches Ergebnis
Rato Micefarmer
- php
0 bla0 Rato Micefarmer
Guten Abend alle miteinander!
Ich habe ein Problem mit folgendem PCRE-Regex:
/(\)*({)?$([a-zA-Z_\x7f-\xff][\w\x7f-\xff]*)(})?/
Wenn ich den nun mit preg_match_all auf folgenden string anwende (4. an die Function übergebene Parameter: PREG_SET_ORDER)...
jajajajajajaj
ddddd
dfjfrkjdkfvjfdkhjsrtj lgujft
ja das ganze ist {$einfach_mal_bloed_sein}
$BLABLABLA {$da \$hee}
{d a} \{ \{ \ \\ \$ \$
\{$BLABBLA}
{${$blabla}} $nun
\$janoch}mals
... enthält der Ergebnisarray unter anderem:
[3] => Array
(
[0] => \$hee}
[1] => \ [2] =>
[3] => hee
[4] => }
)[4] => Array
(
[0] => \{$BLABBLA}
[1] => \ [2] => {
[3] => BLABBLA
[4] => }
)[6] => Array
(
[0] => $nun
[1] => \ [2] =>
[3] => nun
)[7] => Array
(
[0] => \$janoch}
[1] => \ [2] =>
[3] => janoch
[4] => }
)
Merkwürdig daran ist, dass im im jeweiligen 1.Subpattern entweder ein oder gar kein '' steht, egal wie viele '' vor '$' bzw. '{' stehen, im Gesamtergebnis jedoch alle Backslash "berücksichtigt" werden.
Im weiteren Scriptverlauf benötige ich jedoch das Ergenis des 1.Subpatterns. Das bekäme man zwar auch auf andere Art und Weise, doch warum soll ich den komplizierteren Weg über Stringfunktionen gehen wenn es doch einfacher ginge?
Kann mir hier jemand helfen bzw. mir erklären, warum das so ist?
mfg
Rato
Kann mir hier jemand helfen bzw. mir erklären, warum das so ist?
Weil von '(\)*' immer nur das zuletzt gespeicherte Ergebnis für die interne Variablenzuweisung verwendet wird. Bewege mal das Sternchen.
Weil von '(\)*' immer nur das zuletzt gespeicherte Ergebnis für die interne Variablenzuweisung verwendet wird. Bewege mal das Sternchen.
Danke, jetzt funktioniert's tadellos. Habe '(\)*' durch '(\*)' ersetzt. Frag mich nur, warum gerade das diesen Unteschied ausmacht?
mfg
Rato
Hi,
Weil von '(\)*' immer nur das zuletzt gespeicherte Ergebnis für die interne Variablenzuweisung verwendet wird. Bewege mal das Sternchen.
Danke, jetzt funktioniert's tadellos. Habe '(\)*' durch '(\*)' ersetzt. Frag mich nur, warum gerade das diesen Unteschied ausmacht?
Weil nur das gemerkt wird, was _IN_ der Klammer gematcht wird. Und wenn das mehrfach matcht, dann nur das letzte Mal.
Bei (\*) matcht der Klammerinhalt beliebig viele Backslashes.
Bei (\)* matcht der Klammerinhalt genau einen Backslash. Gemerkt wird das letzte Matching - das ist entweder _EIN_ backslash, oder aber nichts (falls der * für 0-mal steht.
cu,
Andreas
Danke, jetzt funktioniert's tadellos. Habe '(\)*' durch '(\*)' ersetzt. Frag mich nur, warum gerade das diesen Unteschied ausmacht?
'(\)*': "Finde und speichere einen Backslash als Variable $x; wiederhole das so oft wie möglich."
'(\*)': "Finde den Backslash so oft wie möglich und speichere in Variable $x."
Danke für alle Antworten
mfg
Rato