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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top