gpt4 book ai didi

php - 将 block 内的 block 与 pcre 匹配

转载 作者:搜寻专家 更新时间:2023-10-31 21:48:51 25 4
gpt4 key购买 nike

this regex101 demo ,我正在尝试获取每个 block 的内容:

{% block works %}
This works
{% endblock %}

{% block main_block %}
{% block sub_block %}
Does not work
{% endblock %} #ends here
This is not covered
{% endblock %}

如果一个 block 内部没有 block ,它会正常工作,但是,在第二个 block (main_block)中,它无法匹配其所有内容,因为在内部发现了一个 block 。

我需要一个正则表达式模式来捕获 main_block 和 sub_block block ,而不是在第一个 {% endblock %} 标记处结束。

现在,我的表达式如下所示:\{\%\s*block\s?([a-z0-9\_]*?)\s?\%\}(.*? )(?>(?:{\%\s* block \s?([a-z0-9\_]*?)\s?\%\}|(?R))*\{\%\s ?endblock\s?\1?\s?\%\}\is

编辑:我的问题被标记为重复,但我认为这与该问题无关,我的情况不同, block 可能无限期地位于 block 内。

最佳答案

使用正则表达式:'/(\*){%\sblock.*\s%}((?:.*|\n)*?)\1{%\sendblock.*\s%}/'

为了使其工作,它确实假设 block 的格式正确,但如果它们的格式正确,这在大多数情况下都有效(它使用每个 block 之前的空格来确定标签是否匹配)。

试试这个尺寸:

<?php

function getBlockText($blockText)
{
$regex = '/(\ *){%\sblock.*\s%}((?:.*|\n)*?)\1{%\sendblock.*\s%}/';
$recursedMatches= [];
preg_match_all($regex, $blockText, $matches);
for ($i = 0; $i < count($matches[2]); $i++) {
if(preg_match($regex, $matches[2][$i])){
array_push($recursedMatches, getBlockText($matches[2][$i]));
} else {
array_push($recursedMatches, $matches[2][$i]);
}
}

return $recursedMatches;
}


$str = '{% block works %}
This works
{% endblock %}

{% block main_block %}
{% block sub_block %}
Does not work
{% endblock %} #ends here
This is not covered
{% block sub_block %}
Does not work
{% endblock %}
{% endblock %}';

print_r(getBlockText($str));

输出:

Array
(
[0] =>
This works

[1] => Array
(
[0] =>
Does not work

[1] =>
Does not work

)

)

关于php - 将 block 内的 block 与 pcre 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48604515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com