web-dev-qa-db-fra.com

Comment obtenir la position d'une correspondance Regex dans une chaîne?

Je sais comment utiliser preg_match et preg_match_all pour trouver les correspondances réelles des modèles d'expression régulière dans une chaîne donnée, mais la fonction que j'écris a non seulement besoin du texte des correspondances, mais pour pouvoir parcourir la chaîne AUTOUR des correspondances .. .

Par conséquent, j'ai besoin de connaître la position de la correspondance dans la chaîne, en fonction d'un modèle d'expression régulière.

Je n'arrive pas à trouver une fonction similaire à strpos () qui permet l'expression régulière ... des idées?

35
johnnietheblack

Vous pouvez utiliser le drapeau PREG_OFFSET_CAPTURE pour cela:

preg_match('/(bar)/', 'Foobar', $matches, PREG_OFFSET_CAPTURE);
var_export($matches);

Le résultat est:

array (
  0 => 
  array (
    0 => 'bar',
    1 => 3,     // <-- the string offset of the match
  ),
  1 => 
  array (
    0 => 'bar',
    1 => 3,
  ),
)
73
Linus Kleen

preg_match a un indicateur facultatif, PREG_OFFSET_CAPTURE, qui enregistre la position de chaîne de l'occurrence de la correspondance dans la "botte de foin" d'origine. Voir la section 'flags': http://php.net/preg_match

5
Marc B

Avec l'utilisation de PREG_OFFSET_CAPTURE sur preg_match (), vous obtiendrez le nombre de fois sur les correspondances sur le modèle. Lorsqu'il y a correspondance, la valeur de décalage commence à 0.

En utilisant cette valeur, vous pouvez à nouveau appeler preg_match en utilisant le paramètre offset.

0
PoX