我基本上是在尝试编写一个json_encode过滤器,通过它我希望得到一个原始的json对象,但是我得到的却是json对象的一个转义字符串。
预期结果:
{"foo":"bar"}实际结果:
"{\"foo\":\"bar\"}"现在,我唯一能用我想要的方式得到它的方法是使用now过滤器,但是这会使它变得不必要的丑陋。
{$object|json_encode|noescape}我的json_encode滤波器
public static function json_encode(FilterInfo $info, mixed $value): string {
$info->contentType = ContentType::JavaScript;
return json_encode($value);
}发布于 2022-06-18 00:08:49
您可以尝试类似{do printf('%s',json_encode($object)) } printf不受限制的东西,不像在php和do标记的上下文中进行回显和打印。即使它受到限制,您也可以定义自己的函数并让它从那里回显。
但是,看起来noescape是一个非常特殊的过滤器,它实际上并不出现在核心过滤器列表中,而是编译器/节点和基本/节点部分在多个位置检查过滤器列表中是否存在nodes过滤器,然后根据它做出决策。
➜ latte grep -r 'noescape' .
./latte/src/Latte/Essential/Nodes/BlockNode.php: if ($node->modifier->hasFilter('noescape') && count($node->modifier->filters) === 1) {
./latte/src/Latte/Essential/Nodes/BlockNode.php: throw new CompileException('Filter |noescape is not expected here.', $tag->position);
./latte/src/Latte/Essential/Nodes/IncludeFileNode.php: $noEscape = $this->modifier->hasFilter('noescape');
./latte/src/Latte/Essential/Nodes/IncludeBlockNode.php: $noEscape = $this->modifier->hasFilter('noescape');
./latte/src/Latte/Compiler/Nodes/Php/FilterNode.php: NoEscape = 'noescape';
./latte/src/Latte/Compiler/Nodes/Php/ModifierNode.php: } elseif ($name === 'noescape') {
./latte/src/Latte/Compiler/Nodes/Php/ModifierNode.php: if ($name === 'noescape') {
./latte/src/Latte/Compiler/Nodes/Php/ModifierNode.php: $noescape = true;
./latte/src/Latte/Compiler/Nodes/Php/ModifierNode.php: if ($this->escape && empty($noescape)) {
➜ latte 我害怕在不用逃避的情况下,试图找到一种简单的方法来做这件事,会把拿铁推向极限。
如果您的扩展找到正在使用的json_encode过滤器,则可能会动态地拍打noescape筛选器。否则,这样做的方法如下:
{$object|escapeJs|noescape}
您还可以尝试一种不同的语法,例如:
{do json_encode_output($object) }
并定义如下的全局函数:
function json_encode_output($object)
{
echo json_encode($object);
}还可以定义您自己的标记,例如:
{json $output}但考虑到拿铁是如何设计的,我可能会接受更详细的建议:
{$object|escapeJs|noescape}或者我可能真的想:
{json_encode($object)|noescape}编辑:
我想我已经想出办法了。简单地从你的功能中回音。
public static function json_encode(FilterInfo $info, mixed $value): string {
echo json_encode($value);
return '';
}https://stackoverflow.com/questions/72654633
复制相似问题