preg_match_all baskı * tüm * maçlar

3 Cevap php

Hy beyler!

Ben preg_match_all kullanarak tüm maçları yazdırmak gerekiyor.

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

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

Sorun benim dizesinde kaç maçlar var bilmiyorum, ve 1000 olsaydı ben biliyordum ve bile o $match[] 'nin tüm bu yazın oldukça aptal olurdu. Ben bu temel şeyler olduğunun farkındayım, ama ben sadece öğreniyorum.

Herhangi bir ipucu için teşekkürler.

3 Cevap

$match[0], $match[1], vb öğeler "yakalamasını" konum, bireysel sonuç değildir.

Eğer for, değil sonuçlarını aradıklarını dayalı çünkü ne olursa olsun orada kaç karşılaşmanın, girişlerin sayısı $matches, sabittir. Arama desen yakalama parantez her çifti için en az bir giriş, artı bir daha her zaman var.

Örneğin, eğer sen yapmak:

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

Maçlar üç sonuç bulunamadı rağmen, sadece iki ürün yok olacaktır. $matches[0] "a1", "b12" ve "C123" (her öğe için tüm maç) ve $matches[1] her madde için yalnızca ilk yakalama içerecek, yani içeren bir dizi olacak , "1", "12" ve "123".

Ben ne istiyorum gibi daha fazla bir şey olduğunu düşünüyorum:

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

Eşleşen her dize ilk yakalama ifadeyi yazdırmak hangi.

print_r($matches) size istediğinizi veriyor mu?

Özyinelemeli döngü olabilir. Bu örnek üzerinden SPL ve PHP 5.1 + gerektirir RecursiveArrayIterator:

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