2009-10-20 2 views
1

Hy парней!preg_match_all print * все * соответствует

Мне нужно распечатать все совпадения, используя preg_match_all.

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

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

Проблема заключается в том, я не знаю, как много матчей там в моей строке, и даже если бы я знал, и если бы это было 1000, что было бы очень глупо, чтобы ввести все эти $match[] «с. Я понимаю, что это основной материал, но я просто изучаю.

Спасибо за любые подсказки.

ответ

6

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

Что напечатает первое выражение захвата от каждой найденной строки.

0

Вы можете петли рекурсивно. В этом примере требуется SPL и PHP 5.1 + с помощью RecursiveArrayIterator:

foreach(new RecursiveArrayIterator($matches) as $match) 
    print $match; 
Смежные вопросы