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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top