【问题标题】:Escape Single Quotes in Template Toolkit模板工具包中的转义单引号
【发布时间】:2011-02-28 18:11:37
【问题描述】:

您是否曾经在模板工具包中为必要的 javascript 处理程序转义单引号?如果是这样,你是怎么做的。

[% SET s = "A'B'C" %]

<a href="/abc.html" onclick="popup('[% s | html_entity %]')">ABC</a>

html_entity 显然不起作用,因为它只处理双引号。那你是怎么做到的呢?

【问题讨论】:

    标签: perl template-toolkit


    【解决方案1】:

    我不使用内联事件处理程序——出于同样的原因,我拒绝为 css 使用 style 属性。 Jquery 只是让在外部 .js 文件中的 html 和 $('.foo').click( function () {} ) 上执行 class="foo" 变得容易。

    但是,为了尽我所能回答这个问题,请查看these docs on Template::Filter 以了解核心内容。

    似乎您可以使用[% s | replace( "'", "\\'" ) %] 来转义单引号。或者你可能会编写一个更复杂的清理 JavaScript 解析器,它只允许函数调用,并制作你自己的 Template::Filter

    【讨论】:

    • 虽然我同意你的建议,但我刚刚意识到真正的解决方案还有另一个反斜杠:[% s |替换( "'", "\\'" ) %]
    • 已确认;单个反斜杠是无操作的,用另一个撇号替换撇号。对于找到此答案的其他任何人,请使用双反斜杠。否则,您的代码可能会导致组建紧急响应团队来调查生产站点上的 Javascript 为何突然停止工作并推送紧急变更集。咳咳。
    【解决方案2】:

    2018年更新供参考:

    TT 有一个方法,称为 squote 用于转义单引号和 dquote 用于双引号。

    [% tim = "Tim O'Reilly" %]
    [% tim.squote %]          # Tim O\'Reilly
    

    有问题的链接类似于:

    <a href="/abc.html" onclick="popup('[% s.squote %]')">ABC</a>
    

    http://www.template-toolkit.org/docs/manual/VMethods.html#section_squote

    【讨论】:

      【解决方案3】:

      记得在替换中对斜线进行双重转义,否则将被解释为转义撇号。

      [% string.replace( "'", "\\'" ) %]
      

      【讨论】:

        【解决方案4】:

        Perl 不是我最擅长的语言……但是!

        我发现最简单的方法是使用JSON 模块。在一个名为JS.pm 的模块中:

        use JSON;
        
        sub encode () {
           my $self = shift;
           my $string = shift;
        
           $json = JSON->new->allow_nonref;
        
           return $json->encode( $string );
        }
        

        更多:http://search.cpan.org/~makamaka/JSON-2.90/lib/JSON.pm

        然后在你的模板中:

        [% use JS; %]
        
        <script>
          var escaped_string = [% JS.encode( some_template_variable ) %];
        </script>
        

        【讨论】:

        • OP 并没有说这是根本问题,但它当然可能是 X-Y 问题。不过,您在这里重新发明轮子,已经有一个成熟的 TT 插件,称为 Template::Plugin::JSON
        • 太棒了!感谢您的信息。
        【解决方案5】:

        你可以试试:popup('[% s | html %]')

        【讨论】:

          猜你喜欢
          • 2011-06-17
          • 2011-05-26
          • 2016-03-03
          • 1970-01-01
          • 1970-01-01
          • 2018-05-29
          • 2010-12-23
          • 2013-11-03
          • 2013-12-26
          相关资源
          最近更新 更多