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.