Ich versuche, eine einfache Template-Engine in PHP für meine MVC-Framework zu kodieren. Ich schreibe eine Methode zu behandeln, wenn Bedingungen in meiner Vorlage mit einigen speziellen Tags.Regex Fehler, verschachtelte Tags
ich diesen Code schrieb:
<?php
$text = '{% if var = val %}
{%if var1 = var1 %}
{% endif %}
{% endif %}
{%if var = val1 %}
{%if var1 = var1 %}
{% endif %}
{% endif %}';
function check_condition($text)
{
/*
1 - preg_match_all (get all conditions)
2 - scroll all the conditions
2.1 - check if the condition is still present in the primary source
2.2 - resolve the condition and get the text to print
3 - replace the text in the primary source
*/
//1
if(preg_match_all('/{% if (.*) %}(.*){% endif %}/s', $text, $conditions))
{
//2
foreach($conditions as $condition)
{
//2.1
if(preg_match('/'.$condition[0].'/', $text))
{
//2.2
preg_match('/{% if (.*) %}/U', $condition[0], $data);
//check for and/or
$data = str_ireplace('{% if ', '', $data);
$data = str_ireplace(' %}', '', $data[0]);
$data = explode(' = ', $data);
if($data[0] == $data[1])
{
//3
$text = str_ireplace($condition[0], 'some text'.$condition[0], $text);
} else {
//check for else
}
}
}
}
return $text;
}
echo check_condition($text);
Der Text var ein Beispiel von Bedingungen enthalten, die Funktion ist nicht vollständig.
Diese Regex:
if(preg_match_all('/{% if (.*) %}(.*){% endif %}/s', $text, $conditions))
Sollte den gesamten Bedingungsblock, in diesem Fall erhalten:
[0] => '{% if var = val %}
{%if var1 = var1 %}
{% endif %}
{% endif %}'
[1] => '{%if var1 = var1 %}
{% endif %}'
[2] => '{%if var = val1 %}
{%if var1 = var1 %}
{% endif %}
{% endif %}'
[3] => '{%if var1 = var1 %}
{% endif %}'
Aber es gibt einen einzigen Block mit dem gesamten Code (aus dem ersten {% if. .%} bis zum letzten {% endif%})
Das Problem ist mit den verschachtelten Bedingungen, ich denke, dass die Regex nicht damit umgehen kann. Wer hat irgendwelche Ideen? Wie kann ich das beheben? Gibt es noch eine andere Methode, die ich verwenden kann?
Nur eine Randnotiz zur Lesbarkeit. Mit Instanzen wie "2.1" mache ich gerne etwas wie "if (! Condition) continue;", damit Sie nicht jedes Mal, wenn Sie eine Bedingung überprüfen, einen Einzug vornehmen müssen. – Sam
ist es gierig. Verwenden Sie einen faulen Indikator '?' nach den übereinstimmenden Elementen innerhalb von Gruppierungen. – Cunning