我的 html 内容看起来像
<body>Hello world</div><div>New day</div></body>
我想解析这个 html 片段并在 Hello 之前添加一个起始 div 标记。我可以遵循什么方法?我尝试使用HTMLCLeaner但它没有帮助基本上这意味着找到结束 div 标签而不匹配开始 div 标签并添加它们。
我的 html 内容看起来像
<body>Hello world</div><div>New day</div></body>
我想解析这个 html 片段并在 Hello 之前添加一个起始 div 标记。我可以遵循什么方法?我尝试使用HTMLCLeaner但它没有帮助基本上这意味着找到结束 div 标签而不匹配开始 div 标签并添加它们。
如果您使用 java 尝试使用Jsoup。就像是
Jsoup.clean("<body><div>Hello world</div><div>New day</div></body>", Whitelist.relaxed());
这将为您提供正确的输出字符串。
更新
您可以使用Jsoup.parse(html)
which 返回 aDocument
您可以调用它toString()
来获取固定的 html,该 html 也将包括所有html
和body
标签。它将为您提供以下 html 输出。
<html>
<head></head>
<body>
<div>
Hello world
</div
<div>
New day
</div>
</body>
</html>
正如您所说,大多数解析器将修复结束标签而不是开始标签,因为除了错误的结束标签之前,他们无法决定从哪里开始开始标签,并且在结束之前添加开始标签是没有用的标签。
您可能需要按照 Trevor Hutto 的建议(基于堆栈的方法)来实现您自己的逻辑,但它会有自己的复杂性取决于您的要求。
你可以使用堆栈。
推送打开的标签,然后当您点击关闭标签时,弹出并将弹出的标签与您刚刚遇到的标签进行比较。
所以很明显,如果你有一个不匹配的,它是一个 div,你可以做一些事情。
John Resig 的HTML Parser在这方面做得很好。它有点旧,但它仍然适用于我的大部分用例。
编辑:实际上,它似乎只修复缺少的结束标签,而不是开始标签......尽管一些调整可能可以让它做后者。
<body>
<div>Hello world</div>
<div>New day</div>
</body>
You can add a div before the hello world or you can remove the closing div after the hello world. Hello world New day
我创建了一个Javascript/jQuery解决方案来添加缺少的起始标签:
将任何 HTML添加到缺少标签的正文中,例如:
hello</h3>
<p>hai</p>
Welcome to fiddle</span>
</div>
Javascript/jQuery
var content;
var i;
var result="";
var previousTag="";
function exeq(){
var a = content.lastIndexOf('<body>');
var z = content.lastIndexOf('</body>');
content = content.substring(a+6,z);
while(i!=-1){
var startAngle = content.indexOf('<');
var endAngle = content.indexOf('>');
i=endAngle;
var ele = content.substring(startAngle,endAngle+1);
if(ele.indexOf("/")!=-1)
{
if(previousTag != ele.replace("/",""))
result = result + ele.replace("/","");
}
result = result + content.substring(0,endAngle+1);
content = content.substring(endAngle+1);
previousTag = ele;
}
/*Below part only to append result to body*/
$('body').append('<h4>Result</h4><textarea>'+result+'</textarea>');
/******************************************/
}
$.get(window.location.href,function(data){
typeof(data)=="object"?window.location = window.location.href:
content = data;
exeq();
});
您可以使用括号平衡中使用的相同技术,除了不返回 True/False,而是修复标签。我曾经为一个工作项目这样做过:
Trevor 所描述的与我所描述的相同(用于括号平衡)。
您不需要 HTMLCLeaner 或任何工具,如果您需要使用 html 非常简单,只需记住所有标签 <'something'> 都与 a 接近,或者使用简单的 <'something'/> 进行总结!