如果我有一个HTML文件test.html:
<p><?= str ?></p>
脚本功能:
var t = HtmlService.createTemplateFromFile("test.html");
t.str = "test\nstring";
var content = t.evaluate().setSandboxMode(...).getContent();
Logger.log(content);
有没有办法用HTML换行符安全地替换换行符?我可以使用String.prototype.replace()将\n
替换为<br/>
,但是我必须使用<?!=
来禁用HTML模板引擎的上下文逃跑。我处理不受信任的输入,所以我需要转义和智能处理换行符。在上下文中使用它会很好。事实上,我编写了自己的escaper,但它只适用于一个上下文。
答案 0 :(得分:5)
我为您的场景看到两个选项,简单的选择是完全忘记替换并使用&lt; pre&gt;标记,它将呈现您的换行符(和其他格式字符)
<pre> <?= str ?> </pre>
第二种是使用自定义函数执行替换和清理输入,以便您可以安全地使用强制打印scriptlet。
在你的HTML中:
<?!= sanitize(str); ?>
和你的.gs:
function sanitize(val){
var vals = val.split('\n'); //split string into an array on newlines
for(var i in vals){
vals[i] = Encoder.htmlEncode(vals[i]); //sanitize each element in the array
}
return vals.join('<br />'); //join the elements as a string, with <br /> as glue.
}
请注意,在我的示例中,我使用此处的库来清理字符串:http://www.strictly-software.com/scripts/downloads/encoder.js
答案 1 :(得分:1)
如果有人好奇,这就是我用来清理不受信任的显示输入的代码。在标签,脚本部分等中使用它是不安全的。这就是为什么谷歌的情境感知清理是如此方便。
function dumbEscapeAndBreak(str) {
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\n/g, '<br/>');
}
function _testEscape() {
GSUnit.assertEquals('my<test<string>is>not&good&okay<br/>fine<br/>okay', dumbEscapeAndBreak("my<test<string>is>not&good&okay\nfine\nokay"));
}
答案 2 :(得分:0)
或者你可以这样做:
在.gs脚本函数中:
var t = HtmlService.createTemplateFromFile("test.html");
var paragraphs = "test\nstring";
t.str = paragraphs.split("\n");
在您的test.html中:
<?
for (i = 0; i < str.length; i++) {
?>
<span><?= str[i]?></span><br />
<!-- <p><?= str[i]?></p> -->
<?
}
?>
您可以使用由您自己决定的<span>
或<p>
标记。您还可以编写一些简单的逻辑来决定何时放置<br />
,例如在<span>
之前的i > 0
之前。这将完全符合您的"test\nstring"
。