Goedenavond allen,

Op 2 december j.l. heb ik alhier een template parser class geplaatst. Hierop heb ik van Jelmer feedback gekregen, welke ik wil verwerken, maar kom er niet uit.

Hergebruik instellingen
Ik wil graag ondervangen dat instellingen nogmaals gebruikt kunnen worden bij andere instellingen i.v.m. veiligheidsproblemen.

Voorbeeld:

<?php
$data = array(
   array(
      "username" => "Jan {password}",
      "password" => "henk24"
   )
);

// Uitkomst:
// Jan henk24
?> 


Hoe kan ik dit ondervangen??

Onbeperkt diepe array's
De instellingen (settings) en loops zijn respectievelijk maximaal 3 en 2 niveaus diep. Door middel van o.a. preg_replace_callback zou dit te ondervangen zijn. Hierdoor moet het dan ook mogelijk worden om loop in loop te maken.

Voorbeeld:

<?php //kleurtjes
<body>
   <div class="menu">

      <!-- loop menu start -->
         <div class="menu">

            <!-- loop item start -->
               <div class="item"></div>
            <!-- loop item start -->

         </div>
      <!-- loop menu end -->

   </div>
</body>
?>


Maar hoe?
Geloof het of niet, maar ik krijg toch een mooie fatal error omdat de klasse al bestaat. :-)

Jouw if-statement omvat niet de definitie, die zal dus onvoorwaardelijk worden uitgevoerd at compile-time, omdat het niet binnen een if valt. Dat jij returnt in jouw if maakt niet uit, daar weet de compiler niks van.

Enfin, dit werkt dus wel:
<?php
if(!class_exists('SplStack')) {
    class SplStack {
        // etc.
    }
}
Heel apart, getest op PHP 5.3.0 zowel CLI als als apache module. Misschien dat APC of Xdebug hier voor verwarring zorgt. (die laatste heb ik geïnstalleerd)


Je blokken worden niet geparsed omdat je in je regular expression wat teveel escaped, en omdat binnen de blokken newlines kunnen voorkomen je de \s switch mag gebruiken, zodat de punt ook newlines matcht. (Aan RichardvV de eer die punt te vervangen)
<?php
'{<!--\s*loop\s*(\w+)\s*start\s*-->(.+?)<!--\s*loop\s*\1\s*end\s*-->}s'
?>
Moet je ook even je parse_block updaten met:
<?php
list(, $tag_name, $a, $separator, $nameholder_name, $b, $nameholder_code) = $matches;
?>


Je expression voor html elementen is wat lastiger, want hoe kan die vinden welke closing-tag bij je element hoort? Met een recursieve expressie zou je het na kunnen lopen, maar dan gaat het fout bij elementen met een class waarvan je niet de inhoud wilt vervangen, bijvoorbeeld een div om een block of een loop heen.

Misschien dat je voor deze elementen doelgericht kan gaan vervangen, dus niet vooraf vervangen met een placeholder, maar direct, als laatste stap van je replace-gebeuren. Hoe precies weet ik niet.

Wanneer je een punt gebruikt om te zoeken, moet je wel oppassen met greedy/nongreedy ( .+ vs .+? ), want je matcht momenteel wat te veel in je expression op zoek naar elementen.

Reageren