Question

Prenez le code suivant:

$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);

Je dois obtenir la position de NAME, FUNC et chaque P dans la cible $ (donc PREG_OFFSET_CAPTURE). Le modèle fonctionne pour Ps, mais il ne correspond à aucun des groupes nommés & Quot; ruleName & Quot; ou & "; funcName &";.

Qu'est-ce qui me manque?

Merci.

Était-ce utile?

La solution

Je pense avoir trouvé la raison.

  1. Vos références arrières nommées sont facultatives.
  2. S'ils concordent (et au premier essai, ils le font), le moteur des expressions rationnelles se tient à gauche de & "LPAREN &".
  3. Le prochain jeton que le moteur d’expression rationnelle essaie de faire correspondre est un caractère espace. En effet, l'expression lookbehind (?<=LPAREN) ne consomme pas de caractères dans la chaîne.
  4. Il ne peut pas correspondre à l'espace car il y a un L
  5. Le moteur d'expression régulière abandonne les correspondances facultatives à partir de 2. et continue jusqu'à ce qu'il trouve l'espace suivant.
  6. Il correspond et continue à correspondre à partir de là, capturant tous les P s. Mais les groupes nommés ont dû être abandonnés pour que cela fonctionne.

Je ne sais pas pourquoi vous avez besoin de regarder derrière vous. Que diriez-vous

/(?P<ruleName>NAME )?(?P<funcName>FUNC )?(?:LPAREN )(?:(?P<arg1>P))|(?P<args>P)(?=(?: RPAREN)|(?: COMMA))/
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top