Frage

Betrachten Sie das folgende Beispiel:

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

Was sie tut, kehrt nur die letzte ‚a‘ in der Serie, aber was ich brauche, ist alle ‚a ist.

Insbesondere muss ich die Position von ALL JEWEILS die ‚a die innerhalb der Zeichenfolge getrennt , so PREG_OFFSET_CAPTURE.

Das Beispiel ist viel komplexer, siehe die zugehörige Frage: Muster ein Array, nicht ihre Elemente per se

Danke

War es hilfreich?

Lösung

Es Gruppen ein Einzelspiel, da die regex X((a),?)*X die gesamte Zeichenfolge übereinstimmt. Die letzte ((a),?) wird gruppiert werden.

Was Sie wollen, entsprechen ist ein a, die einen X, bevor es (und den Beginn des Strings), hat ein Komma vor ihm, oder hat eine X vor ihm (und dem Ende des Strings).

$target = 'Xa,a,aX';
$pattern = '/(?<=^X)a|a(?=X$|,)/';
preg_match_all($pattern, $target, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

Ausgabe:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => a
                    [1] => 1
                )

            [1] => Array
                (
                    [0] => a
                    [1] => 3
                )

            [2] => Array
                (
                    [0] => a
                    [1] => 5
                )

        )

)

Andere Tipps

Wenn Ihre Regex X enthält, passt es einmal. Es findet eine große Übereinstimmung mit Gruppen in ihm. Was Sie wollen, ist viele Spiele, jeder mit seiner eigenen Position.

Also, meiner Meinung nach das Beste, was Sie tun können, ist einfach suchen / a / oder / a,? / Ohne X. Dann entspricht [0] werden alle Auftritte von ‚a‘ enthalten

Wenn Sie sie zwischen X benötigen, Vorauswahl, diesen Teil der Zeichenfolge.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top