2009-11-25 12 views
0

Prenons l'exemple suivant:obtenir la position de tous les matches dans le groupe

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

Ce qu'il fait est de retour que le dernier « a » dans la série, mais ce que je besoin est d'autant « a '.

, je dois particulièrement la position de TOUSCHACUNE DES les « a 'à l'intérieur de la chaîne séparément, PREG_OFFSET_CAPTURE ainsi.

L'exemple est beaucoup plus complexe, voir la question connexe: pattern matching an array, not their elements per se

Merci

+0

Si cette description n'est pas une bonne représentation de votre problème réel, pourquoi commencer ce nouveau poste à tous? –

+0

Il est simplifié, c'est un autre "sous-problème" de mon problème complexe, et il peut être vu comme un problème autonome, avec sa propre solution. – Flavius

+0

La cible peut-elle contenir plusieurs listes de a, par exemple: 'abcdXa, a, a, aXefghiXa, a, a, a, a, a, a, aX'? Si oui, voulez-vous deux tableaux séparés dans ce cas, un pour chaque liste de a, ou un tableau combiné contenant les index de tous les a quel que soit leur origine? –

Répondre

1

Il regroupe une seule correspondance car l'expression régulière X((a),?)*X correspond à la chaîne entière. Les dernières ((a),?) seront regroupées.

Qu'est-ce que vous voulez faire correspondre est un a qui a un X avant (et le début de la chaîne), a une virgule devant elle, ou a un X avant (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 
       ) 

     ) 

) 
0

Lorsque votre regex comprend X, elle correspond à une fois. Il trouve un grand match avec des groupes dedans. Ce que vous voulez, c'est beaucoup de matchs, chacun avec sa propre position.

Donc, à mon avis, le mieux que vous pouvez faire est de rechercher simplement pour/a/ou/a,?/Sans X. Ensuite correspond [0] contiendra toutes les apparences de « a »

Si vous besoin entre X, présélectionnez cette partie de la chaîne.