Получить положение всех матчей в группе - PullRequest
0 голосов
/ 26 ноября 2009

Рассмотрим следующий пример:

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

То, что он делает, возвращает только последний «а» в серии, но мне нужны все «а».

В частности, мне нужна позиция ALL КАЖДЫЙ из a внутри строки отдельно , таким образом, PREG_OFFSET_CAPTURE.

Пример гораздо более сложный, см. Связанный вопрос: шаблон, соответствующий массиву, а не их элементы как таковые

Спасибо

Ответы [ 2 ]

1 голос
/ 26 ноября 2009

Группирует одно совпадение, поскольку регулярное выражение X((a),?)*X соответствует всей строке. Последние ((a),?) будут сгруппированы.

То, что вы хотите сопоставить, это a с X перед ним (и началом строки), с запятой перед ним или с X перед ним (и концом строки).

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

Выход:

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

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

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

        )

)
0 голосов
/ 26 ноября 2009

Когда ваше регулярное выражение содержит X, оно совпадает один раз. Он находит одно большое совпадение с группами в нем. То, что вы хотите, это много матчей, каждый со своей позицией.

Так что, на мой взгляд, лучшее, что вы можете сделать, - это просто искать / a / или / a,? / Без X. Тогда совпадения [0] будут содержать все появления 'a'

Если они вам нужны между X, предварительно выберите эту часть строки.

...