Obter posição de todos os jogos em grupo
Pergunta
Considere o seguinte exemplo:
$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);
O que ele faz está retornando somente o último 'a' na série, mas o que eu preciso é de todos o 'A do.
Particularmente, eu preciso da posição do ALL CADA UM DOS 'A de dentro da cadeia separadamente , assim PREG_OFFSET_CAPTURE.
O exemplo é muito mais complexa, ver a questão relacionada: padrão de correspondência de uma matriz, não seus elementos por se
Graças
Solução
Ele agrupa num único jogo desde o X((a),?)*X
regex corresponde a seqüência inteira. A última ((a),?)
serão agrupadas.
O que você quer jogo é uma a
que tem um X
antes (e o início da string), tem uma vírgula à frente dele, ou tem um X
à frente dele (e no final do texto).
$target = 'Xa,a,aX';
$pattern = '/(?<=^X)a|a(?=X$|,)/';
preg_match_all($pattern, $target, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
Output:
Array
(
[0] => Array
(
[0] => Array
(
[0] => a
[1] => 1
)
[1] => Array
(
[0] => a
[1] => 3
)
[2] => Array
(
[0] => a
[1] => 5
)
)
)
Outras dicas
Quando seu regex inclui X, ele corresponde uma vez. Ele encontra uma grande partida com grupos nele. O que você quer é muitas partidas, cada uma com a sua própria posição.
Então, na minha opinião, o melhor que você pode fazer é simplesmente procurar / a / ou / a,? / Sem qualquer X. Então corresponde [0] conterá todas as aparências de 'a'
Se você precisar deles entre X, pré-selecionar esta parte da string.