2

我需要使用 preg_match_all 打印所有匹配项。

$search = preg_match_all($pattern, $string, $matches);

foreach ($matches as $match) {
    echo $match[0];
    echo $match[1];
    echo $match[...];
}

问题是我不知道我的字符串中有多少匹配,即使我知道并且如果它是 1000,那么键入所有这些$match[]' 将是非常愚蠢的。

4

3 回答 3

8

,等项目不是单独的匹配项,它们是“捕获” $match[0]$match[1]

无论有多少匹配项,条目的数量$matches都是恒定的,因为它基于您要搜索内容,而不是结果。搜索模式中的每对捕获括号总是至少有一个条目,再加上一个条目。

例如,如果您这样做:

$matches = array();
$search = preg_match_all("/\D+(\d+)/", "a1b12c123", $matches);
print_r($matches);

即使找到了三个匹配项,匹配项也只有两个项目。 $matches[0]将是一个包含“a1”、“b12”和“c123”(每个项目的完整匹配项)的数组,并且$matches[1]将仅包含每个项目的第一个捕获,即“1”、“12”和“123”。

我认为你想要的更像是:

foreach ($matches[1] as $match) {
    echo $match;
}

这将从每个匹配的字符串中打印出第一个捕获表达式。

于 2009-10-20T22:57:49.017 回答
0

print_r($matches)能给你想要的吗?

于 2009-10-20T22:41:19.003 回答
0

你可以递归循环。此示例通过RecursiveArrayIterator需要 SPL 和 PHP 5.1+ :

foreach( new RecursiveArrayIterator( $matches ) as $match )
    print $match;
于 2009-10-20T22:41:45.210 回答