preg_match_all soru (ayrı preg_match çağrısı olmadan kapsamını sınırlamak için nasıl)

2 Cevap php

Buna benzer bazı veriler var:

aaa1|aaa2|ZZZ|aaa3|aaa4|aaa5|ZZZ|aaa6|aaa7
I want to match all "aaa[0-9]" BETWEEN "ZZZ" (not the ones outside).

So I have some PHP code:

    $string = "aaa1aaa2zzzzaaa3aaa4aaa5zzzzaaa6aaa7";

    preg_match_all("/zzzz.*(aaa[0-9]).*zzzz/", $string, $matches, PREG_SET_ORDER);

    print_r($matches);

Ama sadece çıkışları:

Array
(
    [0] => Array
        (
            [0] => zzzzaaa3aaa4aaa5zzzz
            [1] => aaa5
        )

)

Ben "aaa3", ek olarak "aaa4" için "aaa5" istiyorum.

preg_match_all() 1 çağrısı ile bunu yapmanın bir yolu var mı?

2 Cevap

Dize bir sınırlayıcı dize (zzzz) ancak iki ayraç dizeleri önce önce oluşur kontrol edin:

$string = "aaa1aaa2zzzzaaa3aaa4aaa5zzzzaaa6aaa7";

preg_match_all("/aaa[0-9](?=.*?zzzz)(?!(?>.*?zzzz).*?zzzz)/", $string, $matches, PREG_SET_ORDER);

print_r($matches);

Ben bu tek bir çağrı ile mümkün olduğunu sanmıyorum. Tüm eşleşen çiftleri çekin için ayraç (zzzz) ve daha sonra başka bir görüşme arasındaki içeriğini çekin bir çağrı yapmak gerekir.

if (preg_match('/zzzz(.*?)zzzz/', $string, $matches)) {
    preg_match_all('/(aaa\d)/', $matches[1], $newmatches);
    print_r($newmatches);
} else {
    echo "No match";
}