迭代来自preg_match_all的匹配

时间:2011-11-14 19:58:01

标签: php regex foreach preg-match-all

我试图在WordPress中弄清楚这个插件的机制。 我有一个preg_match_all函数,如下所示:

preg_match_all('/(?<=\\[\\[).+?(?=\\]\\])/', $content, $matches, PREG_PATTERN_ORDER);
$numMatches = count($matches[0]);

for ($i = 0; $i < $numMatches; $i++) {
  $postSlug = $matches[0][$i];
}

如果我理解正确,count($matches[0])假设$content中只有一个匹配。

我的目标是重新编写for语句以允许preg_match_all脚本中的完整匹配数组。

我假设我应该用foreach ($matches as $postSlug)替换for语句,而不是在最后使用令人困惑的$matches[0][$i]

不幸的是,最终输出似乎没有遍历数组中的每个元素。有任何想法吗?谢谢!

2 个答案:

答案 0 :(得分:4)

  

如果我理解正确的话,count($ matches [0]假设$ content中只有一个匹配。

不完全; $matches[0]表示整个正则表达式中的匹配数组(而不是$matches[1],它是正则表达式的第一个匹配组中的匹配数组)。因此,count($matches[0])是他第一个匹配组中的匹配数。

你可以做你所说的并将for循环重写为foreach循环,但这可能不会改变任何东西,因为两种方法都应该遍历{{1}中的所有元素}。您确定要查找的结果是否与正则表达式匹配?

答案 1 :(得分:2)

如果您确实想要重写此代码,那么我建议您将PREG_SET_ORDER作为最后一个参数,而不是PREG_PATTERN_ORDER。这会先按结果对结果数组进行分组,然后将匹配组分组到第二级。

然后你可以按如下方式循环:

foreach ($matches as $matchgroup) {
    $postslug = $matchgroup[0];
}

您仍然需要[0]才能获得“完全匹配”。如果您的模式包含任何(..)个群组,则[1][2]将对应这些群组。