在JavaScript中使用引号
我从数据库中输出数据(这个数据并不是公开的,但是公司的用户可以进入,也就是说,我并不担心XSS) 。
我试图输出这样的标签:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
描述实际上是数据库中的一个值,就像这样:
Prelim Assess "Mini" Report
我已经尝试用“\”replace,但无论我尝试什么,Firefox都会在评估之后的空格后断开我的JavaScript调用,并导致各种问题。
我必须承认明显的答案,但是对于我的生活,我无法弄清楚。
任何人都在意指出我的白痴?
这里是整个HTML页面(它最终将成为一个ASP.NET页面,但为了解决这个问题,我拿出了除了问题代码之外的所有东西)
<html> <body> <a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a> </body> </html>
您需要将您正在编写的string转义为DoEdit
来擦除双引号字符。 它们导致onclick
HTML属性过早closures。
使用JavaScript转义字符\
,在HTML上下文中是不够的。 您需要用正确的XML实体表示来replace双引号, "
。
"
在这个特定的情况下,正如我以前所build议的,因为HTML上下文。
但是,如果您希望自己的JavaScript代码在任何上下文中独立转义,则可以select原生JavaScript编码:
'
变成\x27
"
变成\x22
所以你的onclick会变成:
DoEdit('Preliminary Assessment \x22Mini\x22');
例如,当将JavaScriptstring作为parameter passing给另一个JavaScript方法( alert()
对此是一个简单的testing方法)时,这也是有效的。
我指的是你的重复堆栈溢出问题, 我如何转义一个onClick处理程序内的JavaScript代码中的string? 。
<html> <body> <a href="#" onclick="DoEdit('Preliminary Assessment "Mini"'); return false;">edit</a> </body> </html>
应该做的伎俩。
在JavaScript中,已经有了对unescaping的unescape
function:
<script type="text/javascript"> var str="this is \"good\""; document.write(unescape(str)) </script>
问题是HTML不能识别转义字符。 您可以通过使用HTML属性的单引号和onclick的双引号来解决此问题。
<a href="#" onclick='DoEdit("Preliminary Assessment \"Mini\""); return false;'>edit</a>
如果你用Java组装HTML,你可以使用Apache commons-lang中的这个很好的工具类来正确地转义所有的东西:
org.apache.commons.lang.StringEscapeUtils
用于Java,Java Script,HTML,XML和SQL的Escape和unescapesstring。
我做了一个使用jQuery的示例
var descr = 'test"inside"outside'; $(function(){ $("#div1").append('<a href="#" onclick="DoEdit(descr);">Click Me</a>'); }); function DoEdit(desc) { alert ( desc ); }
这可以在Internet Explorer和Firefox中使用。
转义空格也是。 这听起来像Firefox假设三个参数,而不是一个。
是不间断的空间字符。 即使不是全部问题,也可能是一个好主意。
这是我如何做,基本上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>
你需要用双反斜杠来引号。
这失败了(由PHP的json_encode产生):
<script> var jsonString = '[{"key":"my \"value\" "}]'; var parsedJson = JSON.parse(jsonString); </script>
这工作:
<script> var jsonString = '[{"key":"my \\"value\\" "}]'; var parsedJson = JSON.parse(jsonString); </script>
请在下面的代码中find使用正则expression式作为inputstring的一部分转义单引号。 它validation如果用户input的string是逗号分隔的,同时它甚至可以转义作为string的一部分input的任何单引号。 为了逃避单引号,只需input反斜杠后跟单引号,例如: \'作为string的一部分。 我使用JQueryvalidation器来处理这个例子,你可以使用你的传输。
有效string示例:
'你好'
'你好,世界'
'你好,世界'
'你好,世界',' '
“这是我的世界”,“没有我就不能享受”,“欢迎,客人”
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.');