Obtenir la position de tous les matchs dans le groupe
Question
Prenons l'exemple suivant:
$target = 'Xa,a,aX';
$pattern = '/X((a),?)*X/';
$matches = array();
preg_match_all($pattern,$target,$matches,PREG_OFFSET_CAPTURE|PREG_PATTERN_ORDER);
var_dump($matches);
Cela ne renvoie que le dernier "a" de la série, mais ce dont j'ai besoin, c'est de tous les "a".
J'ai particulièrement besoin de la position de TOUT CHAQUE du "a" à l'intérieur de la chaîne séparément , ainsi PREG_OFFSET_CAPTURE.
L'exemple est beaucoup plus complexe, voir la question connexe: motif correspondant à un tableau, pas à leurs éléments en soi
Merci
La solution
Il regroupe une seule correspondance car la regex X ((a),?) * X
correspond à toute la chaîne. Le dernier ((a),?)
sera groupé.
Ce que vous voulez faire correspondre est un un
précédé d'un X
(et du début de la chaîne), d'une virgule ou d'un X
devant lui (et la fin de la chaîne).
$target = 'Xa,a,aX';
$pattern = '/(?<=^X)a|a(?=X$|,)/';
preg_match_all($pattern, $target, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
Sortie:
Array
(
[0] => Array
(
[0] => Array
(
[0] => a
[1] => 1
)
[1] => Array
(
[0] => a
[1] => 3
)
[2] => Array
(
[0] => a
[1] => 5
)
)
)
Autres conseils
Lorsque votre expression rationnelle comprend X, elle correspond une fois. Il trouve une grande correspondance avec des groupes. Ce que vous voulez, ce sont de nombreux matchs, chacun avec sa propre position.
Donc, à mon avis, le mieux que vous puissiez faire est simplement de rechercher / a / ou / a,? / sans X. Ensuite, match [0] contiendra toutes les apparences de 'a'
Si vous en avez besoin entre X, présélectionnez cette partie de la chaîne.