提问人:Matt Dawdy 提问时间:1/5/2010 最后编辑:Peter MortensenMatt Dawdy 更新时间:2/29/2020 访问量:581745
JavaScript 中的转义引号
Escape quotes in JavaScript
问:
我正在从数据库输出值(它并没有真正对公众开放,但它对公司用户开放 - 这意味着,我不担心 XSS)。
我正在尝试输出这样的标签:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
DESCRIPTION 实际上是数据库中的一个值,如下所示:
Prelim Assess "Mini" Report
我试过用\替换“,但无论我怎么尝试,Firefox 都会在单词 Assess 后面的空格后面砍掉我的 JavaScript 调用,这会导致各种问题。
我一定错过了显而易见的答案,但就我而言,我无法弄清楚。
有人愿意指出我的白痴吗?
这是整个 HTML 页面(它最终将是一个 ASP.NET 页面,但为了解决这个问题,我删除了除问题代码之外的所有内容)
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
</body>
</html>
答:
您需要转义要写入的字符串以清除双引号字符。它们导致 HTML 属性过早关闭。DoEdit
onclick
在 HTML 上下文中使用 JavaScript 转义字符 , 是不够的。您需要将双引号替换为正确的 XML 实体表示形式 。\
"
评论
'mystring'.replace(/"/g, '"');
我使用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。
评论
问题是 HTML 无法识别转义字符。您可以通过对 HTML 属性使用单引号和对 onclick 使用双引号来解决此问题。
<a href="#" onclick='DoEdit("Preliminary Assessment \"Mini\""); return false;'>edit</a>
评论
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment "Mini"'); return false;">edit</a>
</body>
</html>
应该可以解决问题。
也要转义空格。在我看来,Firefox 假设了三个参数而不是一个参数。 是不间断空格字符。即使这不是全部问题,它可能仍然是一个好主意。
伙计们,JavaScript 中已经有函数可以执行以下非转义操作:unescape
\"
<script type="text/javascript">
var str="this is \"good\"";
document.write(unescape(str))
</script>
评论
如果你在 Java 中组装 HTML,你可以使用 Apache commons-lang 中的这个不错的实用程序类来正确完成所有转义:
org.apache.commons.lang.StringEscapeUtils
转义和取消转义 用于 Java、Java Script、HTML、XML 和 SQL 的字符串。
评论
"
正如我之前所建议的那样,由于 HTML 上下文,在这种特殊情况下会起作用。
但是,如果您希望 JavaScript 代码在任何上下文中独立转义,则可以选择本机 JavaScript 编码:
becomes becomes '
\x27
"
\x22
因此,您的点击将变为:DoEdit('Preliminary Assessment \x22Mini\x22');
例如,当将 JavaScript 字符串作为参数传递给另一个 JavaScript 方法时,这也行得通( 是一个简单的测试方法)。alert()
我向您推荐重复的 Stack Overflow 问题,如何在 onClick 处理程序内的 JavaScript 代码中转义字符串?
评论
"
"
<input value="\x22quoted string\x22">
onclick="..."
value
'mystring'.replace(/"/g, '\\x22').replace(/'/g, '\\x27')
基本上,我就是这样做的.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>
请在下面的代码中找到它使用正则表达式将单引号作为输入字符串的一部分进行转义。它验证用户输入的字符串是否以逗号分隔,同时它甚至可以转义作为字符串的一部分输入的任何单引号。
为了对单引号进行转义,只需输入一个反斜杠,后跟一个单引号,例如:\' 作为字符串的一部分。在这个例子中,我使用了jQuery验证器,你可以根据自己的方便使用。
有效的字符串示例:
“你好”
'你好', '世界'
'你好','世界'
'你好','世界',''
“这是我的世界”,“没有我就无法享受这一切”,“欢迎,客人”
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 separated string values.');
您可以使用 escape() 和 unescape() jQuery 方法。如下图所示,
用于转义字符串并使用 再次恢复。escape(str);
unescape(str_esc);
评论
escape()
encodeURI()
encodeURIComponent()
您可以复制这两个函数(如下所列),并使用它们对所有引号和特殊字符进行转义/取消转义。您不必为此使用 jQuery 或任何其他库。
function escape(s) {
return ('' + s)
.replace(/\\/g, '\\\\')
.replace(/\t/g, '\\t')
.replace(/\n/g, '\\n')
.replace(/\u00A0/g, '\\u00A0')
.replace(/&/g, '\\x26')
.replace(/'/g, '\\x27')
.replace(/"/g, '\\x22')
.replace(/</g, '\\x3C')
.replace(/>/g, '\\x3E');
}
function unescape(s) {
s = ('' + s)
.replace(/\\x3E/g, '>')
.replace(/\\x3C/g, '<')
.replace(/\\x22/g, '"')
.replace(/\\x27/g, "'")
.replace(/\\x26/g, '&')
.replace(/\\u00A0/g, '\u00A0')
.replace(/\\n/g, '\n')
.replace(/\\t/g, '\t');
return s.replace(/\\\\/g, '\\');
}
评论
上一个:如何对双引号中的双引号进行转义?
下一个:带引号的 bash 正则表达式?
评论
onclick