如何在JSTL函数/ EL中转义双引号?

问题描述 投票:19回答:3

我需要使用"函数将\"更改为JSTL replace,以使用输入标签中的字符串,例如:

<input type="hidden" name="text" size="40" value="${text}">

如果${text}具有",则HTML将被破坏。

所以我尝试了

<input type="hidden" name="text" size="40" value="${fn:replace(text, "\"", "\\\""}">

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '\"'}">

但是没有用。页面出现错误,例如

org.apache.el.parser.ParseException:在行上遇到了“”}“”}“”1,第32列。期望以下之一:“。” ...“)” ...“ [” ...“,” ...“>” ...“ gt” ...“ =” ...“ ge” ...“ <=” ...“ le” ...“ ==” ...“ eq” ...“!=” ...“ ne” ...“ &&” ...“和” ...“ ||” ...“要么” ...“ *” ...“ +” ...“-” ...“ /” ...“ div” ...“%” ...“ mod” ...

我该怎么做?

更新

我错过了替换功能的详细介绍。正确的人就是这个亲密的人:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '\"')}">

Update2

我发现在发布文本时,使用\并不是一个好主意,因为这个原因why can't use \" in HTML input tag?。代码应如下所示:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '&quot;')}">
java jstl el
3个回答
23
投票

这不起作用,因为\是Java字符串中的转义字符。为了从字面上表示它,您需要再次用另一个\对其进行转义。同样,"是EL中的特殊字符,您还需要对其进行转义以从字面上表示它。因此,正确的语法应该是:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '\"', '\\\"'}">

但是,您应该实际上使用fn:escapeXml()来防止XSS。它不仅转义了引号,而且还转义了其他字符。

<input type="hidden" name="text" size="40" value="${fn:escapeXml(text)}">

另请参见:


5
投票

您做错了(使用fn:replace)。

正确的方法是:

<input type="hidden" name="text" size="40" value="<c:out value='${text}'/>">
(actually tested code - works 100%)

编辑:经过更多思考:

  • 使用fn:escapeXml的方式(由BalusC编写)也有效并且看起来更好(没有嵌套标签)
  • 使用fn:replace模仿fn:escapeXml正在自找麻烦。您will忘记包含一些应该转义的字符。只需使用现有的,久经考验的fn:escapeXml(或c:out

4
投票

您可能有错字:我看不到那里的封闭括号。试试这个:

${fn:replace(news.title, "\"", "\\\"")}

而且,您是要输出结果还是要更新news.title,以便下次访问news.title时,替换就位了?这将用于输出结果,但不能替代实际值:news.title不会被此调用更改。

© www.soinside.com 2019 - 2024. All rights reserved.