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に基づいているため、一致するものがいくつあっても、 のエントリ数は一定です。常に少なくとも 1 つのエントリがあり、検索パターン内のキャプチャ括弧のペアごとにさらに 1 つのエントリがあります。

たとえば、次のようにします。

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

3 つの一致が見つかった場合でも、一致には 2 つの項目しかありません。 $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 に答える