我需要使用preg_match_all打印所有匹配。
$search = preg_match_all($pattern, $string, $matches);
foreach ($matches as $match) {
echo $match[0];
echo $match[1];
echo $match[...];
}
问题是我不知道我的字符串中有多少匹配,即使我知道并且如果它是1000,那么键入所有$match[]
的内容会非常愚蠢。
答案 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;