如何将HTML转换为有效的XHTML?

xwmevbvl  于 2022-12-09  发布在  其他
关注(0)|答案(4)|浏览(354)

我有一个HTML字符串,在这个例子中,它看起来像

<img src="somepic.jpg" someAtrib="1" >

我正在尝试锻炼一个正则表达式的peice,将匹配的'img'节点,并应用斜线到节点的结束,所以它看起来像。

<img src="somepic.jpg" someAtrib="1" />

本质上,这里的最终目标是确保节点是关闭的,打开的节点在HTML中是有效的,但显然在XML中是无效的。

e7arh2l6

e7arh2l61#

不要使用正则表达式,而是使用专用的解析器。在JavaScript中,使用DOMParser创建一个文档,然后使用XMLSerializer

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>

如果需要在nodejs backend.npm i xmldom中使用xmldom,则必须使用它。

rt4zxlrg

rt4zxlrg2#

你可以创建一个xhtml文档,导入/采用html元素,Html字符串当然可以通过HTMLElement.innerHTML属性解析,关键是使用Document.importNode()或Document. adaptNode()方法将html节点转换为xhtml节点:

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)。

q3qa4bjr

q3qa4bjr3#

除了Rob W的answer之外,还可以使用RegEx提取正文内容:

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搭配使用。*
1tuwyuhd

1tuwyuhd4#

这将做得很好:

result = text.replace(/(<img\b[^<>]*[^<>\/])>/ig, "$1 />");

附录:如果(不太可能)您的代码包含带有尖括号的标记属性(这不是有效的XML/XHTML BTW),那么下面的代码会做得更好一些:

result = text.replace(/(<img\b(?:[^<>"'\/]+|'[^']*'|"[^"]*")*)>/ig, "$1 />");

相关问题