2009-11-25 2 views
0

Рассмотрим следующий пример:Получить позицию всех матчей в группе

$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КАЖДОЙ ИЗ «а внутри строки отдельно, таким образом PREG_OFFSET_CAPTURE.

пример является гораздо более сложным, см смежный вопрос: pattern matching an array, not their elements per se

Благодарности

+0

Если это описание не является хорошим представлением вашей реальной проблемы, поэтому начать этот новый пост вообще? –

+0

Это упрощенная, это еще одна «проблема» моей сложной проблемы, и ее можно рассматривать как отдельную проблему с ее собственным решением. – Flavius

+0

Может ли цель содержать несколько списков a, например: 'abcdXa, a, a, aXefghiXa, a, a, a, a, a, a, aX'? Если да, вы хотите, чтобы в этом случае были два отдельных массива: по одному для каждого списка a или один объединенный массив, содержащий индексы всех a, независимо от того, откуда они пришли? –

ответ

1

Он группирует одно совпадение, так как регулярное выражение 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

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

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

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