Regex kullanarak şablon IFS

4 Cevap php

Hey everyone, I'm working on a PHP application that needs to parse a .tpl file with HTML in it and I'm making it so that the HTML can have variables and basic if statements in it. An if statement look something like this: `

<!--if({VERSION} == 2)-->
Hello World
<!--endif -->

Bu ayrıştırmak için hiçbir şans ile preg_replace kullanarak denedim. Ben denedim model oldu

/<!--if\(([^\]*)\)-->([^<]*)<!--endif-->/e

ile değiştirilir aldığı

if($1) { echo "$2"; }

Herhangi bir neden bu işe yaramaz ve ne ben onu yukarı ve çalışan almak için yapabileceğiniz gibi fikirler?

4 Cevap

Bunu yapmak istemedim düşünüyorum:

'/<!--if\(([^)]*)\)-->([^<]*)<!--endif-->/'

Sizin regex o sadece bir karakter sınıfı vardır:

[^\]*)\)-->([^<]

Buradaki budur:

  • İlk kapanış köşeli ayraç ters eğik çizgiden, bu yüzden tam anlamıyla uyumlu oluyor.
  • Ilk yakalayan grup yakın gerekiyordu ve ikinci bir açık vardı parantez de tam anlamıyla alınır; Bir karakter sınıfı içinde Pars kaçmak için gerekli değildir.
  • İlk tire is, bir meta olarak alınır; bu aralığı oluşturan [) * +, -]
  • Bir karakter sınıfı içinde, çünkü ikinci açılış köşeli ayraç bir değişmez köşeli ayraç olarak alınır.
  • Bu sınıfta ilk karakter değil çünkü ikinci şapka değişmez bir şapka olarak alınır.

Yani, çiftleri kaldırarak ve ASCII düzene karakter sıralama sonra, sizin karakter sınıfı bu eşdeğerdir:

[^()*+,\-<>\[\]^]

Ve karakter sınıfı dışında parantez hala dengeli, böylece regex derler, ama o bile bunu istediğini eşleşen yakın gelmiyor.

Sen endif ve --> arasında bir boşluk var ama düzenli ifadesi buna izin vermez.

Bu arada, bu ... Eğer Smarty gibi önceden oluşturulmuş bir çiftleşmiş motoru kullanarak değil herhangi bir neden var mı korkunç güvensiz görünüyor?

Normal ifadenizin test, ben senin eğik çizgi köşeli ayraç uygulanır bkz. Bir alıntı dize içinde köşeli parantez içinde bir ters eğik çizgi kullanmak için, iki kez kaçmak gerekir:

'/<!--if\(([^\\\]*)\)-->([^<]*)<!--endif-->/e'

Smarty ve PHP kendisi gibi çözümler varken, yeni bir şablon mantık çerçevesi icat ediyoruz Ama neden bilmiyorum.


İşte test kodu aşağıda yorumlarına yanıt olarak, bu.

testinput.tpl:

<!--if({VERSION} == 2)-->
Hello World
<!--endif-->

match.php:

<?php
$template = file_get_contents('testinput.tpl');
print preg_match('/<!--if\(([^\\\]*)\)-->/e', $template) . "\n";
print preg_match('/<!--endif-->/e', $template) . "\n";
print preg_match('/<!--if\(([^\\\]*)\)-->([^<]*)<!--endif-->/e', $template) . "\n";

test run:

$ php match.php
1
1
1

Ben RoBorg katılıyorum, Smarty sizin PHP ve HTML ayrı tutmak için iyi bir yoldur. Zaten bir şey varsa yeniden icat tekerlek gerekmez