Perl: 从变量中扩展双引号时的转义处理

4

我该如何将

my $name = 'John "FOO" Rambo';

扩展到

<span title=\"The great and mighty $name\"

而不是

<span title=\"The great and mighty John "FOO" Rambo\"

这样当生成页面时,我的HTML标记不会被破坏,同时名称中包含"?


2
$name =~ s/"/\\"/g; 是什么意思? - rbm
@rbm 那个确实有效。我以前从未接触过 Perl :) 你能把它作为答案发布吗?这看起来很像一些 sed 表达式。你能否详细说明最后的 g 是什么意思?谢谢。 - Zloj
好的 - 以下是带有解释的翻译内容 - rbm
2
请注意,\" 不是有效的 HTML 转义字符,而 &quot; 才是。 - el.pescado - нет войне
@el.pescado 谢谢,那也是真的。 - Zloj
2个回答

1
正确的HTML应该是以下内容:
<span title="The great and mighty John &quot;FOO&quot; Rambo">...</span>

您可以使用以下方式获得它:
use HTML::Entities qw( encode_entities );

my $html = '<span title="' . encode_entities("The great and mighty $name") . '">...</span>';
   -or-
my $html = '<span title="The great and mighty ' . encode_entities($name) . '">...</span>';

您可能需要使用模板系统。如果您使用Template-Toolkit,模板将会是:

<span title="The great and mighty [% name | html %]">...</span>

这整个时间我一直在手动转义HTML实体,然后再将它们传递给TT。我应该知道那是内置的...是时候阅读一些文档了。 - ThisSuitIsBlackNot
1
@ThisSuitIsBlackNot,这是一个内置的FILTER。它不会转义单引号,因此您需要使用双引号作为属性值分隔符。 - ikegami

-2

正确的HTML代码应使用&quot;

my $name = 'John "FOO" Rambo';
$name =~ s/"/&quot;/g;
my $html = "<span title=\"The great and mighty $name\"/>";
print $html ."\n";

针对您最初的问题进行澄清:

您可以使用简单的正则表达式来替换引号。例如:

my $name = 'John "FOO" Rambo';
$name =~ s/"/\\"/g;
my $html = "<span title=\"The great and mighty $name\"/>";
print $html ."\n";

这个

$name =~ s/"/\\"/g;

简单来说,将所有的"替换为\\"(但由于\是特殊字符,因此需要转义为\\\\\\")。

g表示全局匹配,即字符串中的所有出现。

(例如,如果您只运行$name =~ s/"/\\"/;,那么$name将是John \"FOO" Rambo,但使用g则是John \"FOO\" Rambo

但这不会产生有效的HTML


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接