preg_match_all print * all * matches

时间:2009-10-20 22:39:15

标签: php preg-match-all

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

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

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

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

3 个答案:

答案 0 :(得分:7)

$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;
}

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

foreach( new RecursiveArrayIterator( $matches ) as $match )
    print $match;