获得所有比赛的位置

时间:2009-11-25 21:59:21

标签: 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'。

特别是,我需要 ALL 每个的位置字符串单独,因此PREG_OFFSET_CAPTURE。

示例要复杂得多,请参阅相关问题:pattern matching an array, not their elements per se

由于

2 个答案:

答案 0 :(得分: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
                )

        )

)

答案 1 :(得分:0)

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

所以,在我看来,你能做的最好的事情就是搜索/ a /或/ a,?/没有任何X.然后匹配[0]将包含'a'的所有外观

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