我正在尝试计算开放<tr
的数量,并将它们与结束/tr>
的数量进行比较,以检查HTML生成中的模板错误。我的代码非常简单:
var markup = document.documentElement.innerHTML; //to have it as a string
var trstart_results = (markup.match(/<tr/g) || []).length;
var trend_results = (markup.match(/\/tr>/g) || []).length;
问题是,我有HTML代码95x tr
和97x /tr
,但console.log表示两者都是97x。
任何人都知道,这段代码有什么问题?
答案 0 :(得分:0)
您的代码绝对正常,但浏览器插入了缺少的html标签。从堆栈中看这个问题:
答案 1 :(得分:0)
我创建了一个类似这样的库。我正在处理格式错误的HTML,甚至HTML解析器也无法正确处理。但有些标签总是正确的。
https://github.com/icodeforlove/balanced.js
balanced.matches({
source: document.documentElement.innerHTML,
head: /<tr[^>]*>/,
open: /<tr[^>]*>/,
close: '</tr>'
});
答案 2 :(得分:0)
经过多次尝试后我终于找到了对我有用的解决方案:-)。首先,我需要将整个文档作为字符串。 - &GT;
var markup = document.documentElement.outerHTML;
但这还不够,因为浏览器会更正您的代码。所以你需要将这个字符串拆分为数组。 - &GT;
html_arr = markup.split(" ");
现在我们可以在没有任何浏览器限制的情况下操纵所有数组。所以我的最终代码是:
var markup = document.documentElement.outerHTML;
html_arr = markup.split(" ");
var trcounter = 0;
var trendcounter = 0;
for (i = 0;i<html_arr.length;i++){
if (html_arr[i].match(/<tr/g)){
trcounter += 1;
}else if (html_arr[i].match(/<\/tr>/g)){
trendcounter += 1;
}
}
console.log(trcounter);
console.log(trendcounter);
这段代码很疯狂,在数组中有超过8000个字段,因此在一个非常大的html代码中,执行它会花费3秒钟。
无论如何,我很高兴我解决了这个问题,并且非常高兴我可以与你分享结果: - )
祝你好运!