Pregunta

Considere el siguiente ejemplo:

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

Lo que hace es devolver solo la última 'a' de la serie, pero lo que necesito son todas las 'a'.

Particularmente, necesito la posición de TODOS CADA UNO DE las 'a' dentro de la cadena por separado , por lo tanto PREG_OFFSET_CAPTURE.

El ejemplo es mucho más complejo, vea la pregunta relacionada: patrón que coincide con una matriz, no sus elementos per se

Gracias

¿Fue útil?

Solución

Agrupa una sola coincidencia ya que la expresión regular X ((a),?) * X coincide con la cadena completa. Los últimos ((a) ,?) se agruparán.

Lo que desea hacer coincidir es un a que tiene una X antes (y el comienzo de la cadena), tiene una coma delante o una X delante de él (y el final de la cadena).

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

Salida:

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

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

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

        )

)

Otros consejos

Cuando tu expresión regular incluye X, coincide una vez. Encuentra una gran coincidencia con grupos en ella. Lo que quieres son muchos partidos, cada uno con su propia posición.

En mi opinión, lo mejor que puedes hacer es simplemente buscar / a / o / a,? / sin ninguna X. Entonces las coincidencias [0] contendrán todas las apariencias de 'a'

Si los necesita entre X, preseleccione esta parte de la cadena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top