Eğer bir regex PHP ile bir dize bölmek, ancak kolayca dize bölmek eşleşen dize alabilir miyim?

3 Cevap php

Benim dize böylece benziyor

Şubat 2009

bla bla

Mart 2009

doo daa bla lbla

Septemer 2009

Yani (Ben ilk yapmak istediğiniz ne olduğu, bence) ay içine bölmek için bu regex yazdı

$regex = '/(.*)\s(\d){4}/i';

This matches them perfectly, except it throws away the actual string they were split on .. i.e. I want that information (as in Şubat 2009, Mart 2009 etc)

Ben preg_split() bayrakları ile mucking denedim, ama ne istediğini alamadı.

Ben farklı bir yaklaşım kullanıyor olmalıdır? Kolay bir regex yoluyla metni bölmek ama aslında orada metin tutmak için var mı?

Herhalde (`preg_match_all kullanabilirsiniz, bunu düşünmek gel) 'burada ... Ben sadece cevap benim kendi soruya cevap vermedi umut - Ben toplum ne düşündüğünü görmek için yine de göndermek için gidiyorum.

Teşekkürler

3 Cevap

Kendi yakalama gruba bölme dize koymak. Yani örnek verilen,

$regex = '/(.*)\s(\d){4}/i';

Birkaç değişiklik olur ile:

$regex = '/(.+?)(\s)(\d{4})/i';

Lütfen karşılaşmalar dizi "$ karşılaşmalar" denir, $ maçı [0] bütün maçı içerecektir, $ maçı [1] ay, $ maçı [2] yarma dize, ve $ maçı [3] yıl.

preg_split 4'üncü seçenek bayraklardaki:

http://www.php.net/preg-split

PREG_SPLIT_DELIM_CAPTURE If this flag is set, parenthesized expression in the delimiter pattern will be captured and returned as well.

$a = preg_split('/(.*\s\d{4})/i', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($a);

baskılar

Array
(
    [0] => 

    [1] => February 2009
    [2] => 
bla bla

    [3] => March 2009
    [4] => 
doo daa bla lbla

    [5] => Septemer 2009
    [6] => 

)

Yani oldukça yakın bu.

o olmayan açgözlü değiştirici olmadan bile çalışır görünüyor '?'

preg_match('/(.*)\s(\d{4})/', "Month 2009", $a);

((. *) Tüm dizeyi eşleşmesi gerekir, öyle değil gibi neden acaba?)