46 votes

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 besoin non seulement du texte des correspondances, mais aussi de 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 regex.

Je n'arrive pas à trouver une fonction similaire à strpos() qui permet regex... des idées ?

91voto

Linus Kleen Points 15925

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
  ),
)

Dans une version précédente, cette réponse incluait un groupe de capture dans l'expression régulière ( preg_match('/(bar)/', ...) ). Comme le montrent les premiers commentaires, cela a été déroutant pour certains et a depuis été édité par @Mikkel. Veuillez ignorer ces commentaires.

5voto

Marc B Points 195501

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

0voto

PoX Points 1192

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X