防止Twig在{%include%}之后插入换行符

sel*_*oup 4 php whitespace newline twig

Twig似乎插入了一个\n内容之后{% include %}.我可以用这个简单的例子重现问题:

test.php的:

<?php

require "vendor/autoload.php";

$loader = new Twig_Loader_Filesystem(__DIR__);
$twig = new Twig_Environment($loader, []);

echo $twig->render('test.twig', ['foo' => 'bar']);
Run Code Online (Sandbox Code Playgroud)

test.twig:

{% include "include.twig" %}{{ foo }}
Run Code Online (Sandbox Code Playgroud)

include.twig:

Foo:
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

Foo:bar
Run Code Online (Sandbox Code Playgroud)

但它是:

Foo:
bar
Run Code Online (Sandbox Code Playgroud)

有没有办法阻止这种情况?Twig的空白控制{%- ... -%}不会影响这一点.

更新:

正如在sjagr的回答中所提到的,实际上0x0a在模板的末尾有一个额外的字符,即使在VIM中也没有显示:set binary.

知道我知道为什么会这样,但我仍然需要一个解决方案.使用十六进制编辑器检查所有模板不是一个可行的选择.

sja*_*agr 5

您的文本编辑器在.twig文件末尾附加换行符.

当我使用常规文本编辑器时,我可以重现您在问题中描述的问题nano.include.twig文件的十六进制和显示换行符:

$ xxd -p include.twig
466f6f3a0a
Run Code Online (Sandbox Code Playgroud)

为了证明文本编辑器正在插入这些换行符,我删除了include.twig文件并创建了一个generate.php文件:

file_put_contents('include.twig', 'Foo:');
Run Code Online (Sandbox Code Playgroud)

新十六进制总和:

$ xxd -p include.twig
466f6f3a
Run Code Online (Sandbox Code Playgroud)

而新的Twig输出:

Foo:bar
Run Code Online (Sandbox Code Playgroud)

试试吧!

有趣的是,通过在文件末尾添加空白注释,可以让Twig在包含模板文件时忽略尾随换行符:

Foo:{# #}
Run Code Online (Sandbox Code Playgroud)