我有一个HTML字符串,如下所示
var hoverData = "<table id='hvr-revision_history'><tr><td>{date_value}2013-07-29T11:52:38Z{date_value}</td><td>Error1</td></tr><tr><td>{date_value}2013-07-30T11:52:38Z{date_value}</td><td>Error2</td></tr><tr><td>{date_value}2013-07-31T11:52:38Z{date_value}</td><td>Error3</td></tr></table>";
所需的最终输出是
"<table id='hvr-revision_history'><tr><td>07/29/2013 11:52:38 AM</td><td>Error1</td></tr><tr><td>07/30/2013 11:52:38 AM</td><td>Error2</td></tr><tr><td>07/31/2013 11:52:38 AM</td><td>Error3</td></tr></table>"
我的方法是
var sindex = 0;
while(true){
var sindex = hoverData.indexOf("{date_value}"); //startindex
if(sindex <0)
break;
var eindex = hoverData.indexOf("{date_value}",sindex+1); //endindex
var date = hoverData.substring(sindex+12,eindex); //string between {date_value} tags, so 2013-07-29T11:52:38Z
//logic to parse the date
var hoverData = hoverData.replace(date,parsedDate);
}
var hoverData = hoverData.replace("{date_value}","");
有更好的方法吗? 如果我有两个或更多日期完全相同,我的代码将失败。
答案 0 :(得分:1)
您可以将各个日期块作为正则表达式进行匹配,并使用函数(而不是字符串)作为替换。该函数可以调用你的解析函数,因为你没有包含它,所以我已经在这里找到了它。
var hoverData = "<table id='hvr-revision_history'><tr>" +
"<td>{date_value}2013-07-29T11:52:38Z{date_value}</td>" +
"<td>Error1</td></tr>" +
"<tr><td>{date_value}2013-07-30T11:52:38Z{date_value}</td>" +
"<td>Error2</td></tr>" +
"<tr><td>{date_value}2013-07-31T11:52:38Z{date_value}</td>" +
"<td>Error3</td></tr></table>";
// your "logic to parse the date" would go here
function parseDate(str) {
return "( parsed " + str + " )";
}
// look for our delimiters with *only* the legal timestamp
// characters between them
hoverData = hoverData.replace(/\{date_value\}([A-Z0-9\-\:]+)\{date_value\}/g,
// match gets the fully-matched string, plus any captured patterns
// (the parenthesized chunk) as separate parameters. `datepart` will
// contain the matched timestamp string only
function (match, datepart) {
return parseDate(datepart);
}
);
hoverData = hoverData.replace("{date_value}","");
在此处查看此行动:http://codepen.io/paulroub/pen/CGqlh