Bir dosyada iç içe etiketleri ayrıştırma

6 Cevap php

Ben merak ediyorum - gibi bir şey ayrıştırma en etkili yolu nedir:

{{HEADER}}

Hello my name is {{NAME}}

{{#CONTENT}}
    This is the content ...

    {{#PERSONS}}

        <p>My name is {{NAME}}.</p>

    {{/PERSONS}}

{{/CONTENT}}

{{FOOTER}}

Tabii ki bu biraz sonunda bir çiftleşmiş sistem olması amaçlanmıştır, yani planım bu gibi bir şey olarak, şablonu "üzerinde yatıyordu" bir hashmap yaratmak olduğunu

$hash = array(
    'HEADER' => 'This is a header',
    'NAME' => 'David',
    'CONTENT' => array('PERSONS' => array(array('NAME' => 'Heino'), array('NAME' => 'Sebastian')),
    'FOOTER' => 'This is the footer'
    );

Bu "bölümler" (# ile başlayan etiketleri), bir kereden fazla tekrar edilebilir olduğunu fark değer, ve ben bu beni gezileri ne olduğunu düşünüyorum ...

Ayrıca, herhangi bir bölümü, herhangi bir başka bölme sayısı ve düzenli etiketler içerebilir ...

Yani .. bunu nasıl yaptın?

6 Cevap

Gibi bu şey beklenen çıktısı:

Bu bir başlıktır

Hello my name is David

This is the content ...

My name is Heino.

My name is Sebastian.

Bu bitişin


Nasıl şablonu tekrarlanabilir bölümlere karma haritada iç içe diziler ilişkiyi yönetiyorlar? Olması gerekiyordu şablonun gerçek davranış nedir? Bir dizi olmayan bir bölüm elemanı için sağlanıyorsa, bu ne yapacak? Bir bölüm elemanı tek bir değer verilir, o da (öyle varsayıyorum) sadece tek bir elemanı ile bir dizi olarak aynı muamele edilecektir?

Her neyse, şablon için çözümleyici açısından (ne olursa olsun veri haritalama ile yapıyor sonuna kadar ne) ile ... Ne yapardın olmayan-token içerik için bir jenerik dahil olmak üzere, her simge türü için bir sınıf oluşturmak olduğunu . Bu geçersiz kılınabilir Parse ile ortak bir belirteç temel sınıfından miras, Render ve Harita yöntemleri.

Sizin devlet şeması dışarı grafik ve giriş ve çıkış noktaları her devlet için ne anlamaya, sonra belirteçleri arasındaki çağrı yapısına içine kodlamak. Sonunda size şablonu açıklayan jeton numaralandırılabilir bir koleksiyon elde etmek istiyorum.

Soyut bir biçimde, size jeton HashMap verileri atamak için belirteçlerindeki Haritası çağıran koleksiyonu üzerinde iteate, ve sonra nihai forma şablonu işlemek için Render çağırabilirsiniz sahip olduktan sonra.

Umut olur.

Için en verimli şekilde php kod compile şablonuna olduğunu. Ve sadece include derlenmiş sürümü.

Smarty Template Engine benzer bir şey yapar. Ayrıca smarty kaynağına bakmak ve onlar etiketleri ayrıştırmak nasıl kontrol edebilirsiniz.

Kendi ayrıştırıcı yazmak zorunda ve bu yüzden başkalarının kolayca uzmanlaşmış araçları gerek kalmadan çözümleyici için belgeleri yazabilirsiniz kalmamak XML ya da JSON gibi varolan çözümleyici bir şey kullanarak daha iyi bahse girerim. Kendi ayrıştırıcı yazmak istiyorsanız Ancak, muhtemelen Lex ve Yacc kullanarak içine bakmak istiyorum.

Ben akıllı değil, daha çok çalışmak istiyorum, çünkü bir üçüncü taraf çözümleyici ile gitmek istiyorum, ancak bir egzersiz olarak bu yapıyor ya da eğer gerçekten (PHP Çünkü etiketinin varsayalım) kendi şablon motoru inşa etmek istiyorum, composite design pattern, özellikle, tasarım kalıpları gözden ile başlamak istiyorum.

Kompozit desen XML ayrıştırma dahil olmak üzere bu gibi şeyler için Java çerçevesinde bir çok kullanılır.

. Ben bir php ayrı bir dosya içinde böyle bir şey kullanmak istiyorsunuz:

<?php echo $HEADER ?>

Hello my name is <?php echo $NAME?>

<div id="CONTENT">
    This is the content ...

    <?php foreach ($PERSONS as $PERSON) : ?>

        <p>My name is <?php echo $PERSON['NAME']?>.</p>

    <?php endforeach ?>

</div>

<?php echo $FOOTER ?>

Ve sadece başvurulan değişkenleri doldurulur birinin içinde yukarıdaki dosya bulunmaktadır.

İster inanın ister inanmayın, PHP zaten orada sistemlerini çiftleşmiş uygulamak için iddia tüm özellikleri sağlar. PHP üstüne başka bir soyutlama katmanı (ve karmaşıklığı) eklemenize gerek yoktur.

Bunun için PHP's DOM kullanın. Benim şablon dili kimliği ve sınıf özellikleri ile sadece HTML. Eğer planı sopa istiyorsanız, olsa, ben konteyner unsurları üzerinde ardışık kendisini arayarak, kendi sözdizimi eşleşen bir desen ve karma uygun yedek bulduğu bir geri çağırma işlevi ile preg_replace_callback kullanmak istiyorum.