首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在php-latte v3中编写未转义的javascript过滤器

如何在php-latte v3中编写未转义的javascript过滤器
EN

Stack Overflow用户
提问于 2022-06-17 05:21:12
回答 1查看 100关注 0票数 0

我基本上是在尝试编写一个json_encode过滤器,通过它我希望得到一个原始的json对象,但是我得到的却是json对象的一个转义字符串。

预期结果:

代码语言:javascript
复制
{"foo":"bar"}

实际结果:

代码语言:javascript
复制
"{\"foo\":\"bar\"}"

现在,我唯一能用我想要的方式得到它的方法是使用now过滤器,但是这会使它变得不必要的丑陋。

代码语言:javascript
复制
{$object|json_encode|noescape}

我的json_encode滤波器

代码语言:javascript
复制
public static function json_encode(FilterInfo $info, mixed $value): string {
    $info->contentType = ContentType::JavaScript;
    return json_encode($value);
}
EN

回答 1

Stack Overflow用户

发布于 2022-06-18 00:08:49

您可以尝试类似{do printf('%s',json_encode($object)) } printf不受限制的东西,不像在php和do标记的上下文中进行回显和打印。即使它受到限制,您也可以定义自己的函数并让它从那里回显。

但是,看起来noescape是一个非常特殊的过滤器,它实际上并不出现在核心过滤器列表中,而是编译器/节点和基本/节点部分在多个位置检查过滤器列表中是否存在nodes过滤器,然后根据它做出决策。

代码语言:javascript
复制
➜  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) }

并定义如下的全局函数:

代码语言:javascript
复制
function json_encode_output($object)
{
    echo json_encode($object);
}

还可以定义您自己的标记,例如:

代码语言:javascript
复制
{json $output}

但考虑到拿铁是如何设计的,我可能会接受更详细的建议:

代码语言:javascript
复制
{$object|escapeJs|noescape}

或者我可能真的想:

代码语言:javascript
复制
{json_encode($object)|noescape}

编辑:

我想我已经想出办法了。简单地从你的功能中回音。

代码语言:javascript
复制
    public static function json_encode(FilterInfo $info, mixed $value): string {
        echo json_encode($value);
        return '';
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72654633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档