Php 正则表达式错误,嵌套标记
我正在尝试用PHP为我的MVC框架编写一个简单的模板引擎。 我正在编写一个方法来处理模板中的if条件,使用一些特殊的标记 我写了这段代码:Php 正则表达式错误,嵌套标记,php,regex,nested,conditional-statements,Php,Regex,Nested,Conditional Statements,我正在尝试用PHP为我的MVC框架编写一个简单的模板引擎。 我正在编写一个方法来处理模板中的if条件,使用一些特殊的标记 我写了这段代码: <?php $text = '{% if var = val %} {%if var1 = var1 %} {% endif %} {% endif %} {%if var = val1 %} {%if var1 = var1 %} {% endif %} {% endif %}'; function check_condition($t
<?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);
应获取整个条件块,在这种情况下:
[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 %}'
但是它返回一个包含整个代码的块(从第一个{%if..%}到最后一个{%endif%})
问题在于嵌套条件,我认为正则表达式不能处理这个问题。
有人有什么想法吗?我如何解决这个问题?
我还可以使用其他方法吗?好的
*
匹配它能得到的所有符号。
尝试使用“惰性”版本,将*
替换为*?
。它应该匹配传递到正则表达式下一部分的最小可能字符数
但我想这还是不能满足你的需求。
start1-start2-end2-end1
将在start1-end2
上匹配,即使它不应该匹配。在if
和endif
之间应该有更多的检查,这将解释其中包含的其他对。只是关于可读性的旁注。对于像2.1
这样的实例,如果(!condition)继续,我喜欢做类似的事情代码>这样你就不需要每次检查一个条件时都缩进。这太贪婪了。在匹配元素之后,在分组内部使用惰性指示符?
。是的,我认为使用正则表达式不是最好的方法。。。你知道其他的选择吗?
[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 %}'