我需要使用"
函数将\"
更改为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, '"', '"')}">
这不起作用,因为\
是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)}">
您做错了(使用fn:replace)。
正确的方法是:
<input type="hidden" name="text" size="40" value="<c:out value='${text}'/>">
(actually tested code - works 100%)
编辑:经过更多思考:
您可能有错字:我看不到那里的封闭括号。试试这个:
${fn:replace(news.title, "\"", "\\\"")}
而且,您是要输出结果还是要更新news.title
,以便下次访问news.title
时,替换就位了?这将用于输出结果,但不能替代实际值:news.title
不会被此调用更改。