Bir dize içinde rastgele bir dize Başlarken

4 Cevap

Ben bir dize içinde rastgele bir dize bulmak gerekir.

Aşağıdaki gibi benim dize görünüyor

{Tema} {pembe / tema} veya {tema} {kırmızı / tema}

Ben etiketleri arasındaki metni almak gerekiyor, metin her yenileme sonrasında farklı olabilir.

Benim kod aşağıdaki gibidir görünüyor

$str = '{theme}pink{/theme}'; 
preg_match('/{theme}*{\/theme}/',$str,$matches);

Ama bu hiçbir şans.

4 Cevap

$matches = array();
$str = '{theme}pink{/theme}';
preg_match('/{([^}]+)}([^{]+){\/([^}]+)}/', $str, $matches);

var_dump($matches);

Bu sizin için arıyor olabilir hepsi "etiketleri" tüm maçları dökümü. Deneyin ve $matches bakmak ve ne demek istediğimi görürsünüz. Ben bu kod parçacığını sizin için yararlı olabilir, böylece kendi ilkel şablon dili inşa etmeye çalışıyoruz varsayarak yaşıyorum. Eğer, ben Smarty gibi bir şey bakıyor önerebilir.

Her durumda, normal ifadelerde değerleri yakalamak için parantez gerekir. Üç yakalanan Yukarıdaki değerler vardır:

([^}]+)

theme olan açılış "etiketi," değerini yakalayacaktır. [^}]+ herhangi bir karakterin "bir veya daha fazla gelir ANCAK varsayılan olmayan bu açgözlü yapar } karakter.

([^{]+)

Etiketleri arasında değer yakalayacaktır. Bu durumda biz tüm karakterleri eşleştirmek istediğiniz ANCAK { karakter.

([^}]+)

Kapanış etiketinin değerini yakalayacaktır.

'/{theme}(.*?){\/theme}/', hatta daha fazla kısıtlayıcı '/{theme}(\w*){\/theme}/' iş yapmalıyım

preg_match_all('/{theme}(.*?){\/theme}/', $str, $matches);

Sen ungreedy eşleştirme burada kullanmak gerekir. $matches[1] bir dizi olarak tüm eşleşen etiketlerin içeriğini içerecektir.

preg_match('/{theme}([^{]*){\/theme}/',$str,$matches);

[^{], önemli olan, regex olmayan açgözlü yapmak için açma ayracı dışında herhangi bir karakterle eşleşir Dize / satıra birden fazla etiketi varsa,