Regex: paragraf içinde Maç Thingies

3 Cevap php

Ben A ve C değerleri eşleştirmek istiyorum, ama onlar aynı paragrafın içinde yalnızca.

A:one
C:foo

A:two
B:rofl, some rubbish :::

A:three
B:lol
C:bar

Şu anda ben kullanıyorum

/A:([a-z]*).*?C:([a-z]*)/s

Ama bu beni birbirimize ait değiliz "iki" ve "bar" verir. Nasıl benim / içindeki boş satırı exlude yok. * /??

3 Cevap

Çift satırsonlarını izin vermemek gerekir. Motorunuzun lookaheads izin veriyorsa:

/^A:([a-z]*)(?:(?!(?:\r?\n){2,}).)*^C:([a-z]*)/sm

Bu, Windows / UNIX satırsonlarının üzerinde çalışmak değil, Mac ile olacaktır. Bu, aynı zamanda A ve C hattı (m değiştirici unutmayın) başında olduğundan emin olacaktır.

Bu benim için çalışıyor:

/A:([a-z]*)\v*.*\v?C:([a-z]*)\v*/m

Temelde satırsonlarını etkinleştirin (kaldırın. Satırsonu dahil) ve daha sonra spesifik (\v) Eğer desen bekliyoruz satırsonlarının oluşturmaktadır.

$str=<<<A
A:one
C:foo

A:two
B:rofl, some rubbish :::

A:three
B:lol
C:bar
A;

$s = explode("\n\n",$str);
foreach($s as $k){
    if(strpos($k,"A:") !==FALSE && strpos($k,"C:") !==FALSE){
        $a = array_filter ( ( preg_split("/([A-Z]):|\n+/sm",$k) ) );
        print_r($a);
    }
}

çıktı

$ php test.php
Array
(
    [1] => one
    [3] => foo
)
Array
(
    [1] => three
    [3] => lol
    [5] => bar
)