vor positiven Lookbehind Gruppierung nicht passend
Frage
Nehmen Sie den folgenden Code ein:
$target = 'NAME FUNC LPAREN P COMMA P COMMA P RPAREN';
//$target = 'NAME FUNC LPAREN P RPAREN';
//$target = 'NAME FUNC LPAREN RPAREN';
$pattern = '/(?P<ruleName>NAME )?(?P<funcName>FUNC )?(?:(?<=LPAREN)(?: (?P<arg1>P))|(?P<args>P)(?=(?: RPAREN)|(?: COMMA)))/';
preg_match_all($pattern,$target,$matches,PREG_OFFSET_CAPTURE|PREG_PATTERN_ORDER);
Ich brauche die Position NAME, FUNC und jedes P innerhalb des $ Ziel (also PREG_OFFSET_CAPTURE) zu erhalten. Das Muster arbeitet für Ps, aber es ist auch nicht die benannten Gruppen „ruleName“ oder „funcName“.
entsprichtWas bin ich fehlt?
Danke.
Lösung
Ich glaube, ich habe den Grund gefunden.
- Ihre Namen Rückreferenzierungen sind optional.
- Wenn sie (und auf dem ersten Versuch sie tun) übereinstimmen, dann ist die Regex-Engine auf der linken Seite „LPAREN“ steht.
- Die nächsten Token das Regex-Engine anzupassen versucht, ist ein Leerzeichen. Dies liegt daran, das Lookbehind Ausdruck
(?<=LPAREN)
keine Zeichen in der Zeichenfolge verbrauchen. - Es kann nicht den Raum passen, weil es eine L
- Die Regex-Engine verwirft die optionalen Spiele von 2. und geht weiter bis zum nächsten Raum findet.
- Sie passt und hält von nun an passenden, alle
P
s einzufangen. Aber die genannten Gruppen hatten dafür aufgegeben werden zu arbeiten.
Ich bin mir nicht sicher, warum Sie das Lookbehind benötigen. Wie wäre es
/(?P<ruleName>NAME )?(?P<funcName>FUNC )?(?:LPAREN )(?:(?P<arg1>P))|(?P<args>P)(?=(?: RPAREN)|(?: COMMA))/
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow