Php 获取组中所有匹配项的位置

Php 获取组中所有匹配项的位置,php,regex,pcre,Php,Regex,Pcre,考虑以下示例: $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); 它只返回系列中的最后一个“a”,但我需要的是所有的“a” 特别是,我需要将字符串中的所有和中的每个的位置分别设置为,从而进行预偏移捕获 示例要

考虑以下示例:

$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);
它只返回系列中的最后一个“a”,但我需要的是所有的“a”

特别是,我需要将字符串中的所有中的每个的位置分别设置为,从而进行预偏移捕获

示例要复杂得多,请参见相关问题:


谢谢

当您的正则表达式包含X时,它只匹配一次。它找到一个与其中的组相匹配的大匹配项。您需要的是许多匹配,每个都有自己的位置

因此,在我看来,最好只搜索/a/或/a,不带任何X。然后匹配项[0]将包含“a”的所有外观


如果在X之间需要它们,请预先选择字符串的这一部分

它将单个匹配项分组,因为正则表达式
X((a),?)*X
匹配整个字符串。最后一个
((a),?)
将被分组

您要匹配的是一个
a
,它前面有一个
X
(以及字符串的开头),前面有一个逗号,或者前面有一个
X
(以及字符串的结尾)


如果这个描述不能很好地描述你的实际问题,为什么还要开始写这篇新文章呢?它被简化了,它是我复杂问题的另一个“子问题”,可以被视为一个独立的问题,有自己的解决方案。目标能否包含多个a的列表,例如:“abcdXa,a,a,aXefghiXa,a,a,a,a,aX”?如果是这样的话,您希望在这种情况下使用两个单独的数组,一个用于a的每个列表,还是一个包含所有a的索引的组合数组,而不管它们来自何处?不,只有一对X,没有嵌套或其他。我需要在目标中找到a的每个位置。
$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
                )

        )

)