0

我想<tr>从javascript中的输入字符串中解析一些。我尝试使用正则表达式(<tr[^>]*>(?:.(?!</tr>))*.</tr>)*。但我只得到最后一个<tr>。另请参阅jsfiddle

$("#container").append(content);

parts = new RegExp("^(.*tbody[^>]*>)(.*)(</tbody>.*)").exec(content);
table = parts[1] + parts[3];
rowString = parts[2];
$("#rowString").text(rowString);

// This is the interesting row:
rows = new RegExp("(<tr[^>]*>(?:.(?!</tr>))*.</tr>)*").exec(rowString);

$("#count").text(rows.length - 1 + " row(s) found");

for (rowIndex = 1; rowIndex < rows.length; rowIndex += 1) {
    rowListItem = $("<li></li>");
    rowListItem.text(rows[rowIndex]);
    $("#list").append(rowListItem);
}

更新

感谢您的回答。我会按照 DhruvPathak 建议的方式去做。不幸的是,jQuery 不是选项,因为它有一个“RangeError: Maximum call stack size exceeded”的大表。尽管我不再需要它,但有人知道我的正则表达式有什么问题吗?

4

2 回答 2

2

而是将此字符串设置为由 document.createElement 创建的节点的 innerHTML,然后使用 getElementsByTagName。

例如:http: //jsfiddle.net/5JwXr/

var parentCont = document.createElement('div');
parentCont.innerHTML = content ;
x = parentCont.getElementsByTagName('tr');
alert(x.length);
于 2013-07-30T13:22:26.710 回答
0

这是您的代码的完整重做,具有工作结果...使用 jquery 而不是正则表达式(因为我注意到您部分使用 jquery):http: //jsfiddle.net/T66ph/8/

$("#container").append(content);
$tbody = $(content).find("tbody");
$("#rowString").text($tbody.html());
$rows = $tbody.find("tr");
$("#count").text($rows.length + " row(s) found");
$temp = $("<div>");
$rows.each( function() {
    $temp.append($("<li>").text(this.outerHTML));
});
//adding the DOM all at once instead of little by little will help performance
$("#list").append($temp.html());
于 2013-07-30T13:38:43.863 回答