• Faut-il échapper les "%" dans une regex PHP?! Je n'ai rien lu à ce sujet
• PHP possède le flag u (ungreedy), [\s\S] n'est donc pas requis (.* sera plus lisible)
• Applique l'OpenClosed principle, et remplace ta grosse fonction de parse() par un appel à un ensemble de parsers distincts, qui décorent ta classe:
• PHP possède le flag u (ungreedy), [\s\S] n'est donc pas requis (.* sera plus lisible)
• Applique l'OpenClosed principle, et remplace ta grosse fonction de parse() par un appel à un ensemble de parsers distincts, qui décorent ta classe:
Code PHP :
<?php
interface IParser {
public function parse($contentToParse); /// @return string Parsed content
}
class ...
{
private $parsers = array();
public function addParser(IParser $parser) {
$this->parsers[] = $parser;
}
public function parse() {
$content = $this->content;
foreach ($this->parsers as $parser)
$content = $parser->parse($content);
return $content;
}
// ...
}
Du coup, tu pourras ajouter de nouveaux parsers à la volée, plutôt que d'éditer le code de la classe tout le temps:
Code PHP :
<?php
class varParser implements IParser {
public function parse($content) {
return preg_replace("~{{(\w+)}}~", "<?php echo \$this->data['$1']; ?>", $content);
}
}
class skipParser implements IParser {
public function parse($content) {
preg_replace_callback("#\{\% ?NOPARSE ?\%\} ?([\s\S]*) ?\{\% ?ENDNOPARSE ?\%\}#", array($this, "_noparse_replacement"), $content);
return $content;
}
private function _noparse_replacement($matches) {
$str = $matches[1];
$str = str_replace("{", "{", $str);
return str_replace("}", "}", $str);
}
}
$templateEngine = new ...();
$templateEngine->addParser(new skipParser());
$templateEngine->addParser(new varParser());