JS - regexp - 打开标签与封闭标签

时间:2017-08-25 18:08:58

标签: javascript regex

我正在尝试计算开放<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。

任何人都知道,这段代码有什么问题?

3 个答案:

答案 0 :(得分:0)

您的代码绝对正常,但浏览器插入了缺少的html标签。从堆栈中看这个问题:

Do browsers automatically insert missing HTML tags?

答案 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秒钟。

无论如何,我很高兴我解决了这个问题,并且非常高兴我可以与你分享结果: - )

祝你好运!