RegEx 从树枝模板中提取块[重复]

问题描述 投票:0回答:3

在 PHP 中,我想提取树枝块中包含的文本,并认为正则表达式是最有效的。

假设我有一个包含以下内容的文件“index.twig”:

{% block content %}
Content of the page...
{% endblock %}

这段代码运行得很好:

$input = file_get_contents("index.twig"); 
preg_match_all('/\{%\s*block\s*content\s*\%}([^\%}]*)\{%\s*endblock\s*\%}/', $input, $output);

$output 将包含预期结果。

但是,如果输入文件类似于:

{% block content %}
{{ a_tag }}
Content of the page...
{% endblock %}

在这种情况下,结束 }} 会破坏正则表达式,并且 $output 为空。

有正确正则表达式的任何线索吗?

提取块内容的另一种解决方案?

我想得到:

{{ a_tag }}
Content of the page...
php regex twig
3个回答
1
投票

使用

[^\%}]*
意味着您可以匹配除使用 否定字符类 列出的字符之外的任何字符,在本例中为
%
(您不必转义)和
}

使用这种方法,您无法在块之间匹配

{{ a_tag }}


获取值的一种方法是匹配块的起始代码,直到第一次出现结束块。在两者之间,您匹配所有不以结束块模式开头的行。

您可以使用

\s
来匹配水平空白字符,使用
\h
来匹配任何 unicode 换行序列,而不是使用
\R

{%\h*block\h*content\h*%}\R((?:(?!{%\h*endblock\h*%}).*\R)*){%\h*endblock\h*%}

图案将匹配:

  • {%\h*block\h*content\h*%}\R
    匹配块内容部分和换行符
  • (
    捕获第 1 组
    • (?:(?!{%\h*endblock\h*%}).*\R)*
      如果该行不以结束块模式开头,则匹配整行和换行符
  • )
    关闭第 1 组
  • {%\h*endblock\h*%}
    匹配端块部分

正则表达式演示


1
投票

您可以简单地将与树枝标签匹配的所有内容替换为空字符串。这是一个例子:

<?php
$x = <<<EOT
{% block content %}
  {{ a_tag }}
  Content of the page...
{% endblock %}
EOT;

$x = preg_replace(['/\{%[^\{\}]*%\}\n*/m', '/\{\{[^\{\}]*\}\}\n*/m'], '', $x);
$y = preg_replace('/\{%[^\{\}]*%\}\n*/m', '', $x);
print $x;
print PHP_EOL;
print $y;

0
投票

这是我从评论中使用的解决方案:

{%\h*block\h*content\h*%}\R((?:(?!{%\h*endblock\h*%}).*\R)*){%\h*endblock\h*%}

这里有 2 个用于设置正则表达式模式的有用链接:

© www.soinside.com 2019 - 2024. All rights reserved.