逃避模板工具包中的单引号

时间:2010-06-07 15:09:17

标签: perl template-toolkit

你有没有逃过模板工具包中的单引号来获取必要的javascript处理程序?如果是这样,你怎么做。

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

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

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

5 个答案:

答案 0 :(得分:8)

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

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

好像你可以做[% s | replace( "'", "\'" ) %],以逃避单引号。或者你可以写一个更复杂的消毒javascript解析器,它只允许函数调用,并自己创建Template::Filter

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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>

答案 4 :(得分:0)

请记住在替换中双重转义斜杠,否则它将被解释为转义撇号。

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