Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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 - Fatal编程技术网

Php 如何在两个自定义标记之间获取内容?

Php 如何在两个自定义标记之间获取内容?,php,regex,Php,Regex,我正在尝试编写一个简单的模板系统,但我遇到了一个问题。如果我有这样一个字符串: {% for x in xx %} some string 1 {% endfor %} {% for y in yy %} some string 2 {% endfor %} 如何获取内容某些字符串1和某些字符串2。我尝试将它们与正则表达式匹配,正则表达式查找{%for.+in.+%}和{%endfor%}并获取它们之间的内容,但在本例中,它得到的是: some string 1 {%

我正在尝试编写一个简单的模板系统,但我遇到了一个问题。如果我有这样一个字符串:

{% for x in xx %}
    some string 1
{% endfor %}

{% for y in yy %}
    some string 2
{% endfor %}
如何获取内容
某些字符串1
某些字符串2
。我尝试将它们与正则表达式匹配,正则表达式查找
{%for.+in.+%}
{%endfor%}
并获取它们之间的内容,但在本例中,它得到的是:

    some string 1
{% endfor %}

{% for y in yy %}
    some string 2
我该怎么办

更新:
我想我需要的是一个正则表达式,它可以做这样的事情:

count = 0
while not the end:
    if match("{% for .+ in .+ %}")
        count += 1
    else if match("{% endfor %}")
        count -= 1
    if count == 0 
        // get contents between the first {% for in %} and the last {% endfor %}

正则表达式可以计数吗?

很可能您正在正则表达式的某个地方使用
*
,这是贪婪的。尝试使用
*?
代替,这是非贪婪的


(另外,对于任何类型的标记嵌套,您都不希望像那样使用regex;相反,您需要实际使用某种类型的堆栈。)

PHP已经是一个优秀的模板系统,如果你想要一个像样的模板系统,为什么还要依赖一个非常复杂的正则表达式来进一步使它复杂化呢。

我只想要一个支持loopsPHP的简单模板系统,但是它已经做到了这一点,那么增加另一层复杂度有什么好处呢?是的,我将编写一个递归函数来支持嵌套循环,
{%for x in xx%}
之间的显著区别是什么?我强烈建议不要创建自己风格的模板语言,除非是为了学习。正如Stephan所说,PHP已经成为一种优秀的模板语言。额外的层只会增加复杂性和CPU周期,几乎没有附加值。@fireeyedboy是的,它有一些学习的目的