假设我有以下字符串:
var string = "<td>123</td><td>asd</td>";
我想获取td的值并将它们放在一个数组中。我尝试使用foreach函数,但我的正则表达式在第一次关闭td后停止并获取&lt;之间的所有内容。和&gt;。
var regex = '<([^<> ]*)([^<>]*)?>([^>]*)<\/([^<>]*)>';
var string = "<td>123</td><td>asd</td>";
var result = string.match(regex);
result.forEach(function($var){
console.log($var);
});
输出:
<td>123</td>
td
undefined
123
td
我需要操作这些值,这样我就可以直接在foreach函数中工作,而无需先拆分成数组。
我可以使用正则表达式来完成这项工作吗?我不能使用jQuery或将字符串附加到html。
答案 0 :(得分:1)
单独使用regex来解析DOM是一个禁忌。然而..
如果您没有嵌套<td>
,可以使用以下代码获取值数组:
var string = "<td>123</td><td>asd</td>";
var tds = string.split("</td>");
var values = [];
for(var i=0; i<tds.length-1; i++){ //last element is empty if you split like this
values.push(tds[i].substr(4)); //ommit the "<td>"
}
alert(values);
更复杂的结构可能是一个问题,我建议你将TD分解为单独的,然后使用正则表达式(/<td>(.*)</td>/g
并选择组1)提取值。但是对于这个例子,它工作正常。
答案 1 :(得分:0)
您可以尝试以下代码,
> var re = /[^<>]+(?=<\/)/g;
undefined
> var result = string.match(re);
undefined
> result.forEach(function($var){
... console.log($var);
... });
123
asd
> console.log(result);
[ '123', 'asd' ]
<强>解释强>
[^<>]+
匹配任何不属于<
或>
的字符一次或多次。(?=<\/)
Lookahead声称以下任何内容必须为</
答案 2 :(得分:0)
使用<td>
或</td>
中的任何一个拆分字符串,并拒绝""
。
这对你有用
var string = "<td>123</td><td>asd</td>";
var contents = string.split(/<td>|<\/td>/);
contents = contents.filter(function(el){return el != ""})
console.log(contents) //["123","asd"]
答案 3 :(得分:0)
Do not parse HTML using RegExp!
这是针对您的问题的jQuery版本:
$("<tr/>").append("<td>123</td><td>asd</td>") // build a row with the cells
.find("td") // get the cells
.map(function() { return $(this).text(); }); // for each cell, get the content
结果:["123", "asd"]
编辑:我发现你不能使用jQuery,这很不幸,因为你真的需要一个DOM解析器,jQuery很优雅,可以做更多。
答案 4 :(得分:0)
避免使用正则表达式解析HTML / XML!
我想用JavaScript做一个简单的方法:
function extractValues(code)
{
var tr = document.createElement('tr');
tr.innerHTML = code;
var tds = values.getElementsByTagName('td');
var values = [];
for (var i = 0; i < tds.length; i++) {
values.push(tds[i].innerHTML);
}
return values;
}
console.log(extractValues("<td>123</td><td>asd</td>"));
如果你真的想要一个正则表达式,请使用:
/<td>((?:.(?!<\/td>))*.?)<\/td>/g