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

它所做的只是返回系列中的最后一个'a',但我需要的是所有'a'。

特别是,我需要字符串中所有 每个'a'的位置,因此PREG_OFFSET_CAPTURE

该示例要复杂得多,请参阅相关问题:模式匹配数组,而不是它们的元素本身

谢谢

4

2 回答 2

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
                )

        )

)
于 2009-11-25T22:25:25.167 回答
0

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

所以,在我看来,你能做的最好的事情就是简单地搜索 /a/ 或 /a,?/ 而没有任何 X。然后 matches[0] 将包含所有出现的“a”

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

于 2009-11-25T22:24:30.233 回答