Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式错误,嵌套标记_Php_Regex_Nested_Conditional Statements - Fatal编程技术网

Php 正则表达式错误,嵌套标记

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为我的MVC框架编写一个简单的模板引擎。 我正在编写一个方法来处理模板中的if条件,使用一些特殊的标记

我写了这段代码:

<?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 %}'