preg_match_all ve tırnak içinde newlines

1 Cevap php

Bir diğer çaylak regex sorun / soru. Ben muhtemelen bu yüzden ben SO düzenli genel marifet istismar düşündüm saçma şey yapıyorum ;)

Satırsonlarını maç için çalışıyoruz ama onlar çift tırnak veya tek tırnak ya da içinde cereyan yalnızca. Ben de tırnak arasında olan ama hiçbir satırsonlarını içeren dizeleri yakalamak istiyorum.

Tamam bu yüzden çıkışı ile, ne var orada. Bunun altında, ben almak istiyorum çıkış olacaktır. Herhangi bir yardım büyük mutluluk duyacağız! :)

Ben bir acemi ve tüm varlık, benim desenleri oluşturmak yardımcı olmak için Regex Coach kullanın. RC göre, ben kaynağı desen veri içinde tüm tekrarlarını maç yok, ama benim PHP, bu multi-line kısmı üzerinden atlar. Ben boşuna, zaten 'm' desen değiştirici ile denedim.

$ CompressedData İçeriği:

<?php
$Var = "test";
$Var2 = "test2";
$Var3 = "blah blah
blah blah blah
blah blah blah blah";
$Var4 = "hello";
?>

Desen / Kodu:

preg_match_all('!(\'|")(\b.*\b\n*)*(\'|")!', $CompressedData, $Matches);

$ Sonuç Şu print_r çıkışı:

Array
(
    [0] => Array
        (
            [0] => "test"
            [1] => "test2"
            [2] => "hello"
        )
    ...
}

$ Sonuç İSTENİLEN print_r çıkışı:

Array
(
    [0] => Array
        (
            [0] => "test"
            [1] => "test2"
            [2] => "blah blah
blah blah blah
blah blah blah blah"
            [3] => "hello"
        )
    ...
}

1 Cevap

m değiştirici nokta maç satırsonlarını yapmaz. İşte s değiştirici için budur. m ^ ve ek hatların $ maç başlama / bitiş string / bitiş başlatmak için yapar.

Try /(\'|")((?:(?!\1).)*)\1/s

Açıklama:

(\'|"): Tek veya çift tırnak Maç. O geribaşvuru oldu hangi bir hatırla \1.

(?:(?!\1).): sürece (\1 olarak) tırnak açma karakteri değil gibi herhangi bir karakter Maç.

(...*): mümkün olduğunca sık tekrarlayın ve geribaşvuru de maçı yakalamak \2.

\1: tırnak açma karakteri Maç.