如果我的字符串看起来像这样
"<First key="ab" value="qwerty"/>
<First key="cd" value="asdfg"/>
<First key="ef" value="zxcvb"/>"
我希望以格式
获取数据AB:&#34; QWERTY&#34; CD:&#34; asdfg&#34; EF:&#34; zxcvb&#34;
我应该如何编写JS?
答案 0 :(得分:3)
查看您尝试过的代码会很有用,但这是您可以实现的方法:
使用正则表达式来挑选字符串的相关部分。
var regex = /key="([a-zA-Z]+)" value="([0-9a-zA-Z\-\.]+)"/;
删除空元素的功能。
var notEmpty = function (el) { return el !== ''; };
split
将字符串放入回车符的数组中,并使用reduce
通过将正则表达式应用于每个数组元素来构建新对象。
var out = str.split('\n').filter(notEmpty).reduce(function(p, c) {
var match = c.match(regex);
p[match[1]] = match[2];
return p;
}, {});
输出
{
"ab": "qwerty",
"cd": "asdfg",
"ef": "zxcvb"
}
答案 1 :(得分:0)
请更清楚地说明您的问题(您希望获得哪种结果数据类型?),或尝试以下功能:
var string = '<First key="ab" value="qwerty"/><First key="cd" value="asdfg"/><First key="ef" value="zxcvb"/>'
var ParseMyString1 = function(str){
var arr = str.split(/[</>]+/); //"
//console.log(arr);
var result = [];
for (var i =0; i<arr.length; i++) {
var subStr=arr[i];
if (subStr.length!==0) {
var subArr = subStr.split(/[\s"=]+/); //"
//console.log(subArr);
var currObj = {};
var currKey = "";
var currVal = "";
for (var j =0; j<arr.length; j++) {
if (subArr[j]=="key"){
currKey = subArr[++j];
}else if (subArr[j]=="value"){
currVal = subArr[++j];
}
};
currObj[currKey] = currVal;
result.push(currObj);
};
};
console.log("ParseMyString1:");
console.log(result);
};
var ParseMyString2 = function(str){
var arr = str.split(/[</>]+/); //"
//console.log(arr);
var resultObj = {};
for (var i =0; i<arr.length; i++) {
var subStr=arr[i];
if (subStr.length!==0) {
var subArr = subStr.split(/[\s"=]+/); //"
//console.log(subArr);
var currKey = "";
var currVal = "";
for (var j =0; j<arr.length; j++) {
if (subArr[j]=="key"){
currKey = subArr[++j];
}else if (subArr[j]=="value"){
currVal = subArr[++j];
}
};
resultObj[currKey] = currVal;
};
};
console.log("ParseMyString2:");
console.log(resultObj);
};
$(document).ready(function(){
ParseMyString1(string);
ParseMyString2(string);
});
这些函数返回如下结果(对象数组):
ParseMyString1:
[{ab:"qwerty"},{cd:"asdfg"},{ef:"zxcvb"}]
ParseMyString2:
{ab:"qwerty",cd:"asdfg",ef:"zxcvb"}
答案 2 :(得分:0)
首先,您的字符串无效(双引号内的双引号)。您需要使用\"
转义内部引号,或者只使用单引号替换内部引号。
但是,假设您的数据始终采用您显示的格式,这个简单的代码将以您希望的方式提取数据:
var data = "<First key='ab' value='qwerty'/><First key='cd' value='asdfg'/><First key='ef' value='zxcvb'/>";
data = data.replace(/<First /g, " ").replace(/\/>/g, "").replace(/key=/g, "").replace(/value=/g, "").trim();
var ary = data.split(" ");
var iteration = "";
var result = "";
for(var i = 0; i < ary.length; i+=2){
iteration = ary[i].replace(/'/g, "") + ":" + ary[i+1].replace(/'/g, "\"");
alert(iteration);
result += " " + iteration;
}
alert("Final result: " + result);
&#13;
答案 3 :(得分:0)
您的输入是一种XML。最好的方法就是这样对待它。我们将其解析为XML,但为此,我们需要首先将其包装在根元素中:
var str = "<Root>" + input + "</Root>"
我们用
解析它var parser = new DOMParser();
var dom = parser.parseFromString(str, "text/xml");
获取文档元素(Root
):
var docelt = dom.documentElement;
现在我们可以使用getAttribute
之类的标准DOM访问接口来遍历其子代并构建我们的结果:
var result = {};
var children = docelt.children;
for (var i = 0; i < children.length; i++) {
var child = children[i];
result[child.getAttribute('key')] = child.getAttribute('value');
}
> result
< Object {ab: "qwerty", cd: "asdfg", ef: "zxcvb"}
您可以根据需要将上述循环逻辑替换为reduce
或其他内容。
这种方法的优势在于它利用了内置的解析器,因此我们最终不会对XML的语法做出假设。例如,如果属性在等号之前或之后具有空格,则在另一个答案中建议的正则表达式将失败。如果值包含Unicode字符,则会失败。如果XML格式错误,它将以奇怪的方式失败。等等。