【问题标题】:Iterating over matches from preg_match_all从 preg_match_all 迭代匹配
【发布时间】:2011-12-28 23:06:17
【问题描述】:

我试图弄清楚这个插件在 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]

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

【问题讨论】:

    标签: php regex foreach preg-match-all


    【解决方案1】:

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

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

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

    您仍然需要[0] 才能获得“完全匹配”。如果您的模式有任何(..) 组,那么[1][2] 将对应于那些..

    【讨论】:

      【解决方案2】:

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

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

      您可以按照您所说的将for 循环重写为foreach 循环,但这可能不会改变任何事情,因为这两种方法都应该遍历$matches[0] 中的所有元素。您确定要查找的结果与您的正则表达式匹配吗?

      【讨论】:

      • 你是对的。 $matches[0] 指的是整个表达式中的匹配数组。我能够成功地遍历数组。谢谢。
      猜你喜欢
      • 2013-07-06
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      相关资源
      最近更新 更多