我需要使用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;” 中... “gt”...... “&LT;” ... “lt”...... “&gt; =”...... “ge”...... “&lt; =”...... “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, '"', '"')}">
答案 0 :(得分:22)
它不起作用,因为\
是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)}">
答案 1 :(得分:5)
你做错了(使用 fn:replace )。
正确的方法是:
<input type="hidden" name="text" size="40" value="<c:out value='${text}'/>">
(actually tested code - works 100%)
编辑:更多思考:
答案 2 :(得分:4)
你可能有一个错字:我没有在那里看到一个关闭的paren。试试这个:
${fn:replace(news.title, "\"", "\\\"")}
此外,您是要尝试输出结果还是尝试更新news.title
,以便下次访问news.title
时更换到位?这将用于输出结果,但不能替换实际值:此调用不会更改news.title
。