Obtener posición de todos los partidos en grupo
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
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.