给出文字
<b>This is some text</b>
我想将它写入我的页面,以便它显示如下:
<b>This is some text</b>
而不喜欢这个
这是一些文字
使用escape("<b>This is some text</b>")
在firefox中给了我这个可爱的宝石
%3Cb%3EThis%20is%20some%20text%3C/b%3E
并不是我所追求的。有什么想法吗?
答案 0 :(得分:58)
这应该适合您:http://blog.nickburwell.com/2011/02/escape-html-tags-in-javascript.html
function escapeHTML( string )
{
var pre = document.createElement('pre');
var text = document.createTextNode( string );
pre.appendChild(text);
return pre.innerHTML;
}
安全警告
该函数不会转义单引号和双引号,如果在错误的上下文中使用,可能仍会导致XSS。例如:
var userWebsite = '" onmouseover="alert(\'gotcha\')" "';
var profileLink = '<a href="' + escapeHtml(userWebsite) + '">Bob</a>';
var div = document.getElemenetById('target');
div.innerHtml = profileLink;
// <a href="" onmouseover="alert('gotcha')" "">Bob</a>
感谢buffer指出这种情况。摘录自this blog post。
答案 1 :(得分:25)
我最终这样做了:
function escapeHTML(s) {
return s.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/</g, '<')
.replace(/>/g, '>');
}
答案 2 :(得分:16)
对于HTML DOM文档可用的情况,我喜欢@limc的答案。
我喜欢@Michele Bosi和@Paolo对非HTML DOM文档环境(如Node.js)的回答。
@Michael Bosi的答案可以通过一次调用替换和巧妙的替换函数来取消调用替换4次的优化:
function escape(s) {
return s.replace(/[&"<>]/g, function (c) {
return {
'&': "&",
'"': """,
'<': "<",
'>': ">"
}[c];
});
}
console.log(escape("<b>This is some text.</b>"));
@ Paolo的范围测试可以通过精心选择的正则表达式进行优化,并且可以通过使用替换函数来消除for循环:
function escape(s) {
return s.replace(/[^0-9A-Za-z ]/g, function(c) {
return "&#" + c.charCodeAt(0) + ";";
} );
}
console.log(escape("<b>This is some text</b>"));
正如@Paolo所指出的,这种策略适用于更多场景。
答案 3 :(得分:2)
试试这个htmlentities for javascript
function htmlEntities(str) {
return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
}
答案 4 :(得分:2)
这是一个用尖括号替换html实体的函数。您可能希望将其展开以包含其他字符。
function htmlEntities( html ) {
html = html.replace( /[<>]/g, function( match ) {
if( match === '<' ) return '<';
else return '>';
});
return html;
}
console.log( htmlEntities( '<b>replaced</b>' ) ); // <b>replaced</b>
答案 5 :(得分:2)
如果您正在使用XHTML,则需要使用CDATA
部分。你也可以在HTML中使用它们,但HTML并不严格。
我将字符串常量拆分,以便此代码在CDATA块内的XHTML上内联工作。如果您将JavaScript作为单独的文件来源,那么您不需要为此烦恼。请注意,如果您 使用带有内联JavaScript的XHTML,那么您需要将您的代码封装在CDATA块中,否则其中一些代码将无效。你会遇到奇怪的,微妙的错误。
function htmlentities(text) {
var escaped = text.replace(/\]\]>/g, ']]' + '>]]><' + '![CDATA[');
return '<' + '![CDATA[' + escaped + ']]' + '>';
}
&#34;适当&#34;转义文本的方法是使用DOM函数document.createTextNode
。这实际上并没有逃避文本;它只是告诉浏览器创建一个本质上未解析的文本元素。但是,您必须愿意使用DOM来使用此方法:即,您使用appendChild
等方法,而不是innerHTML
属性等。这将填充带有文本的ID an-element
的元素,该元素不会被解析为(X)HTML:
var textNode = document.createTextNode("<strong>This won't be bold. The tags " +
"will be visible.</strong>");
document.getElementById('an-element').appendChild(textNode);
jQuery为名为createTextNode
的{{1}}提供了一个方便的包装器。这很方便。这里使用jQuery的功能相同:
text
答案 6 :(得分:2)
您可以对字符串中的所有字符进行编码:
function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
或者只是针对主角担心(&amp;,inebreaks,&lt;,&gt;,&#34;和&#39;),如:
function encode(r){
return r.replace(/[\x26\x0A\<>'"]/g,function(r){return"&#"+r.charCodeAt(0)+";"})
}
test.value=encode('Encode HTML entities!\n\n"Safe" escape <script id=\'\'> & useful in <pre> tags!');
testing.innerHTML=test.value;
/*************
* \x26 is &ersand (it has to be first),
* \x0A is newline,
*************/
&#13;
<textarea id=test rows="9" cols="55"></textarea>
<div id="testing">www.WHAK.com</div>
&#13;
答案 7 :(得分:1)
我使用以下函数,使用&amp;# nnn ; 表示法转义每个字符,但 az AZ 0-9 和空间强>
function Escape( s )
{
var h,
i,
n,
c;
n = s.length;
h = '';
for( i = 0; i < n; i++ )
{
c = s.charCodeAt( i );
if( ( c >= 48 && c <= 57 )
||( c >= 65 && c <= 90 )
||( c >= 97 && c <=122 )
||( c == 32 ) )
{
h += String.fromCharCode( c );
}
else
{
h += '&#' + c + ';';
}
}
return h;
}
示例:
Escape('<b>This is some text</b>')
返回
<b>This is some text</b>
该函数是代码注入攻击证明,unicode证明,纯JavaScript。
这种方法比创建DOM文本节点的方法<强>慢大约50倍但是功能在100-150毫秒内仍然会丢失一个百万(1,000,000)个字符串。
(2011年初测试MacBook Pro - Safari 9 - Mavericks)