PHP preg_replace fonksiyonu yeni hatlar da dahil olmak üzere

3 Cevap php

Ben satırdan fazla görünebilir bir dize maç için çalışıyorum. Bu başlar ve belirli bir dize ile biter:

{a}some string
can be multiple lines
{/a}

Ben bir regex ile {a} arasındaki her şeyi kapmak ve {/a} miyim? Bu gibi. Yeni hat uymuyor, ama hayır şans ile aşağıdakileri denedim:

$template = preg_replace( $'/\{a\}([.\n]+)\{\/a\}/', 'X', $template, -1, $count );
echo $count; // prints 0

Bu maçları. ya da \ n kendi konum, ama birlikte zaman!

3 Cevap

Ben satırsonlarını eşleşen sadece nokta daha fazla sorunları var düşünüyorum, ama bana bir biçimlendirme öneri ile başlayalım. Sen regex sınırlayıcı değil, sadece çizgi ('/') olarak sadece ilgili herhangi bir noktalama işareti kullanabilirsiniz. Eğer başka bir karakter kullanırsanız, regex içinde bölü kaçmak zorunda kalmazsınız. Ben '%' PHPers arasında popüler olduğunu anlamak; senin desen argüman yapacak:

'%\{a\}([.\n]+)\{/a\}%'

Bir karakter sınıfı (köşeli parantez) içinde göründüğünde nokta, özel anlamını kaybeder çünkü Şimdi, istediğiniz gibi regex işe yaramadı nedeni - yani [.\n] sadece bir nokta veya bir satır besleme maçlar . Ne aradılar (?:.|\n), ama ben satırbaşı yanı sıra satır besleme eşleşen tavsiye olurdu:

'%\{a\}((?:.|[\r\n])+)\{/a\}%'

Kelime "satır", Windows stili "\ r \ n", ya da eski-Mac tarzı "\ r" "\ n" Unix-stili ifade edebilir olmasıdır. Herhangi belirli bir web sayfası, bu iki veya daha fazla stil bir karışımı herhangi birini ihtiva edebilir; "\ n" ve "\ r \ n" bir karışımı çok yaygındır. Ama (Bu aynı zamanda tek-line veya dotall modu olarak bilinir) / s modu ile, bu konuda endişelenmenize gerek yok:

'%\{a\}(.+)\{/a\}%s'

Ancak, yine de bu bir mevcut var orijinal regex ile başka sorun var: + açgözlü. Yani, metnin birden fazla {a}...{/a} dizisi varsa, sizin regex uygulanan ilk kez ilk {a} dan ([{son için, hepsini maç olacak 3)]}. Düzeltmek için basit yolu bir soru işareti ekleyerek + ungreedy (aka, "tembel" veya "isteksiz") yapmak için:

'%\{a\}(.+?)\{/a\}%s'

Son olarak, ben senin desen argüman açmadan alıntı önce '$' ne yapacağını bilmiyorum. Ben PHP yapmıyorum, ama bu benim için bir sözdizimi hatası gibi görünüyor. Birisi bu konuda beni eğitmek olsaydı, bunu takdir ediyorum.

Dan http://www.regular-expressions.info/dot.html:

"The dot matches a single character, without caring what that character is. The only exception are newline characters."

Eğer ifade bir sondaki / s bayrak eklemek gerekir.