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“.

entspricht

Was bin ich fehlt?

Danke.

War es hilfreich?

Lösung

Ich glaube, ich habe den Grund gefunden.

  1. Ihre Namen Rückreferenzierungen sind optional.
  2. Wenn sie (und auf dem ersten Versuch sie tun) übereinstimmen, dann ist die Regex-Engine auf der linken Seite „LPAREN“ steht.
  3. 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.
  4. Es kann nicht den Raum passen, weil es eine L
  5. Die Regex-Engine verwirft die optionalen Spiele von 2. und geht weiter bis zum nächsten Raum findet.
  6. Sie passt und hält von nun an passenden, alle Ps 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
scroll top