var doc = new DOMParser().parseFromString('<img src="foo">', 'text/html');
var result = new XMLSerializer().serializeToString(doc);
// result:
// <html xmlns="http://www.w3.org/1999/xhtml"><head></head><body> (no line break)
// <img src="foo" /></body></html>
var di = document.implementation;
var hd = di.createHTMLDocument();
var xd = di.createDocument('http://www.w3.org/1999/xhtml', 'html', null);
hd.body.innerHTML = '<img>';
var img = hd.body.firstElementChild;
var xb = xd.createElement('body');
xd.documentElement.appendChild(xb);
console.log('html doc:\n' + hd.documentElement.outerHTML + '\n');
console.log('xhtml doc:\n' + xd.documentElement.outerHTML + '\n');
img = xd.importNode(img); //or xd.adoptNode(img). Now img is an xhtml element
xb.appendChild(img);
console.log('xhtml doc after import/adopt img from html:\n' + xd.documentElement.outerHTML + '\n');
输出应为:
html doc:
<html><head></head><body><img></body></html>
xhtml doc:
<html xmlns="http://www.w3.org/1999/xhtml"><body></body></html>
xhtml doc after import/adopt img from html:
<html xmlns="http://www.w3.org/1999/xhtml"><body><img /></body></html>
Rob W的答案在chrome(至少29及以下)中不起作用,因为DOMParser不支持“text/html”类型,XMLSerializer在chrome中为html文档生成html语法(而不是xhtml)。
var doc = new DOMParser().parseFromString('<img src="foo">', 'text/html');
var result = new XMLSerializer().serializeToString(doc);
/<body>(.*)<\/body>/im.exec(result);
result = RegExp.$1;
// result:
// <img src="foo" />
注意:parseFromString(htmlString, 'text/html');在IE9中会掷回错误,因为text/htmlmimeType不是supported in IE9。不过可与IE10和IE11搭配使用。*
4条答案
按热度按时间e7arh2l61#
不要使用正则表达式,而是使用专用的解析器。在JavaScript中,使用
DOMParser
创建一个文档,然后使用XMLSerializer
:如果需要在nodejs backend.
npm i xmldom
中使用xmldom,则必须使用它。rt4zxlrg2#
你可以创建一个xhtml文档,导入/采用html元素,Html字符串当然可以通过HTMLElement.innerHTML属性解析,关键是使用Document.importNode()或Document. adaptNode()方法将html节点转换为xhtml节点:
输出应为:
Rob W的答案在chrome(至少29及以下)中不起作用,因为DOMParser不支持“text/html”类型,XMLSerializer在chrome中为html文档生成html语法(而不是xhtml)。
q3qa4bjr3#
除了Rob W的answer之外,还可以使用RegEx提取正文内容:
parseFromString(htmlString, 'text/html');
在IE9中会掷回错误,因为text/htmlmimeType不是supported in IE9。不过可与IE10和IE11搭配使用。*1tuwyuhd4#
这将做得很好:
附录:如果(不太可能)您的代码包含带有尖括号的标记属性(这不是有效的XML/XHTML BTW),那么下面的代码会做得更好一些: