Échapper des devis en JavaScript

Je lance des valeurs à partir d'une base de données (il n'est pas vraiment ouvert à l'entrée publique, mais il est ouvert à l'entrée par un utilisateur de l'entreprise – ce qui signifie que je ne m'inquiète pas de XSS .)

J'essaie de générer une étiquette comme celle-ci:

<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a> 

DESCRIPTION est en fait une valeur de la base de données qui ressemble à ceci:

 Prelim Assess "Mini" Report 

J'ai essayé de remplacer "avec \", mais peu importe ce que j'essaie, Firefox continue de décoller mon appel JavaScript après l'espace après le mot Évaluer , et cela cause toutes sortes de problèmes.

Je dois répondre à la réponse évidente, mais pour la vie de moi, je ne peux pas comprendre.

Quelqu'un soigne-t-il à souligner mon idiot?

Voici la page HTML complète (ce sera une page ASP.NET éventuellement, mais pour résoudre ce problème, j'ai retiré tout le reste du code problème)

 <html> <body> <a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a> </body> </html> 

Vous devez échapper à la chaîne que vous écrivez dans DoEdit pour DoEdit à double cotation. Ils provoquent l' onclick attribut HTML onclick prématurément.

L'utilisation du caractère d'échappement JavaScript, \ , n'est pas suffisant dans le contexte HTML. Vous devez remplacer la double-citation par la représentation d'entité XML appropriée, &quot; .

&quot; Fonctionnerait dans ce cas particulier, comme cela a été suggéré avant moi, en raison du contexte HTML.

Cependant, si vous souhaitez que votre code JavaScript soit échappé de manière indépendante pour n'importe quel contexte, vous pouvez opter pour le codage natif de JavaScript:
' \x27
" \x22

Alors votre onclick deviendrait:
DoEdit('Preliminary Assessment \x22Mini\x22');

Cela fonctionnerait par exemple également lors du passage d'une chaîne JavaScript en tant que paramètre à une autre méthode JavaScript (l' alert() est une méthode d'essai facile pour cela).

Je vous réfère à la question du déploiement du stack en double. Comment puis-je échapper à une chaîne dans le code JavaScript d'un gestionnaire onClick? .

 <html> <body> <a href="#" onclick="DoEdit('Preliminary Assessment &quot;Mini&quot;'); return false;">edit</a> </body> </html> 

Doit faire l'affaire.

Folks, il y a déjà la fonction unescape en JavaScript qui fait l'évolutivité pour \" :

 <script type="text/javascript"> var str="this is \"good\""; document.write(unescape(str)) </script> 

Le problème est que le code HTML ne reconnaît pas le caractère d'échappement. Vous pouvez contourner cela en utilisant les guillemets simples pour l'attribut HTML et les guillemets pour l'onclick.

 <a href="#" onclick='DoEdit("Preliminary Assessment \"Mini\""); return false;'>edit</a> 

Si vous assemblez le HTML en Java, vous pouvez utiliser cette jolie classe d'utilité à partir de Apache commons-lang pour faire tout ce qui échappe correctement:

Org.apache.commons.lang.StringEscapeUtils
Escapes et unescapes Strings pour Java, Java Script, HTML, XML et SQL.

J'ai fait un échantillon en utilisant jQuery

 var descr = 'test"inside"outside'; $(function(){ $("#div1").append('<a href="#" onclick="DoEdit(descr);">Click Me</a>'); }); function DoEdit(desc) { alert ( desc ); } 

Et cela fonctionne dans Internet Explorer et Firefox.

Éclairez également les espaces. Il me semble que Firefox suppose trois arguments au lieu d'un. &nbsp; Est le caractère de l'espace sans rupture. Même si ce n'est pas tout le problème, il se peut que ce soit une bonne idée.

C'est ainsi que je le fais, essentiellement str.replace(/[\""]/g, '\\"') .

 var display = document.getElementById('output'); var str = 'class="whatever-foo__input" id="node-key"'; display.innerHTML = str.replace(/[\""]/g, '\\"'); //will return class=\"whatever-foo__input\" id=\"node-key\" 
 <span id="output"></span> 

Vous devez échapper à des guillemets avec double barre oblique inverse.

Cela échoue (produit par json_encode de PHP):

 <script> var jsonString = '[{"key":"my \"value\" "}]'; var parsedJson = JSON.parse(jsonString); </script> 

Cela marche:

 <script> var jsonString = '[{"key":"my \\"value\\" "}]'; var parsedJson = JSON.parse(jsonString); </script> 

Veuillez trouver dans le code ci-dessous qui échappe aux guillemets simples dans le cadre de la chaîne saisie en utilisant une expression régulière. Il valide si la chaîne entrée par l'utilisateur est séparée par des virgules et, en même temps, elle échappe à une citation (s) unique (s) entrée (s) dans la chaîne. Pour échapper à une seule citation, saisissez la barre oblique vers l'arrière puis une citation unique comme: \ 'en tant que partie de la chaîne. J'ai utilisé le validateur JQuery pour cet exemple que vous pouvez utiliser selon votre moyen de transport.

Exemples de chaînes valides

'Bonjour'

'Bonjour le monde'

'Bonjour le monde'

'Bonjour le monde',' '

«C'est mon monde», «Je ne peux pas profiter de cela sans moi.», «Bienvenue, Invité»

HTML:

 <tr> <td> <label class="control-label"> String Field: </label> <div class="inner-addon right-addon"> <input type="text" id="stringField" name="stringField" class="form-control" autocomplete="off" data-rule-required="true" data-msg-required="Cannot be blank." data-rule-commaSeparatedText="true" data-msg-commaSeparatedText="Invalid comma separated value(s)."> </div> </td> 

JavaScript:

  /** * * @param {type} param1 * @param {type} param2 * @param {type} param3 */ jQuery.validator.addMethod('commaSeparatedText', function(value, element) { if (value.length === 0) { return true; } var expression = new RegExp("^((')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))(((,)|(,\\s))(')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))*$"); return expression.test(value); }, 'Invalid comma seperated string values.');