J'ai besoin de changer "
à \"
avec remplacement JSTL fonction pour utiliser la chaîne dans la balise d'entrée comme:
<input type="hidden" name="text" size="40" value="${text}">
Si la ${text}
a la "
, le HTML sera cassé.
J'ai donc essayé
<input type="hidden" name="text" size="40" value="${fn:replace(text, "\"", "\\\""}">
et
<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '\"'}">
mais n'a pas fonctionné. La page fait des erreurs comme
org.Apache.el.parser.ParseException: rencontré ""} ""} "" à la ligne 1, colonne 32. Attendait l'un de: "." ... ")" ... "[" ... "," ... ">" ... "gt" ... "<" ... "lt" ... "> =". .. "ge" ... "<=" ... "le" ... "==" ... "eq" ... "! =" ... "ne" ... "&&" ... "et" ... "||" ... "ou" ... "*" ... "+" ... "-" ... "/" ... "div" ... "%" ... "mod" .. .
Comment puis-je faire ceci?
Mise à jour
J'ai raté une parenthèse étroite de la fonction de remplacement. Le bon était celui-ci avec une parenthèse étroite:
<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '\"')}">
Update2
J'ai découvert que lors de la publication de textes, en utilisant \
n'est pas une bonne idée pour cette raison pourquoi ne pas utiliser\"dans la balise d'entrée HTML? . Le code devrait être comme ceci:
<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '"')}">
Cela ne fonctionne pas car le \
Est un caractère d'échappement dans la chaîne Java. Pour le représenter littéralement, vous devez l'échapper à nouveau avec un autre \
. Le "
Est également un caractère spécial dans EL, vous devez également l'échapper pour le représenter littéralement. Ainsi, la syntaxe appropriée aurait été:
<input type="hidden" name="text" size="40" value="${fn:replace(text, '\"', '\\\"'}">
Mais, vous devriez en fait utiliser fn:escapeXml()
pour empêcher XSS. Il échappe non seulement aux guillemets, mais aussi aux autres personnages.
<input type="hidden" name="text" size="40" value="${fn:escapeXml(text)}">
Vous vous trompez (avec fn: replace ).
La bonne façon est:
<input type="hidden" name="text" size="40" value="<c:out value='${text}'/>">
(actually tested code - works 100%)
Modifier: Après réflexion,
Vous pouvez avoir une faute de frappe: je ne vois pas de paren de fermeture là-dedans. Essaye ça:
${fn:replace(news.title, "\"", "\\\"")}
De plus, essayez-vous de SORTIR les résultats ou essayez-vous de mettre à jour news.title
donc la prochaine fois que vous accéderez à news.title
le remplacement est en place? Cela fonctionnera pour sortir le résultat, mais pas pour remplacer la valeur réelle: news.title
ne sera pas modifié par cet appel.