考虑以下示例:
$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
由于
答案 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之间需要它们,请预先选择字符串的这一部分。