使用 Javascript 从字符串中解析值
Parse Values from String Using Javascript
试图找到从大字符串中提取值的最有效方法。
EXT-X-DATERANGE:ID="PreRoll_Ident_Open",START-DATE="2016-12-14T120000.000z",DURATION=3,X-PlayHeadStart="0.000",X-AdID="AA-1QPN49M9H2112",X-TRANSACTION-VPRN-ID="1486060788",X-TrackingDefault="1",X-TrackingDefaultURI="http,//606ca.v.fwmrm.net/ad/l/1?s=g015&n=394953%3B394953&t=1485791181366184015&f=&r=394953&adid=15914070&reid=5469372&arid=0&auid=&cn=defaultImpression&et=i&_cc=15914070,5469372,,,1485791181,1&tpos=0&iw=&uxnw=394953&uxss=sg579054&uxct=4&metr=1031&init=1&vcid2=394953%3A466c5842-0cce-4a16-9f8b-a428e479b875&cr="s=0&iw=&uxnw=394953&uxss=sg579054&uxct=4&metr=1031&init=1&vcid2=394953%3A466c5842-0cce-4a16-9f8b-a428e479b875&cr="
我以上面为例。
这个想法是提取 : 之前的所有大写字符串作为对象键,引号之间的所有内容直到下一个逗号作为其值。然后迭代整个字符串,直到创建此对象。
nonParsed.substring(nonParsed.lastIndexOf("="")+1, nonParsed.lastIndexOf("","));
我一开始就有这个概念,但如果有人帮助我迭代并提高效率,我们将不胜感激。
最终输出类似于 --
{
'EXT-X-DATERANGE:ID': 'PreRoll_Ident_Open',
'START-DATE': '2016-12-14T120000.000z',
'DURATION': '3',
...
}
headers 似乎有混合大小写的字符串,而不仅仅是大写。我会根据 = 字符查找 key-value 对。您可以构造一个正则表达式并使用 exec() 方法进行迭代并构建您的 object.
var input = 'EXT-X-DATERANGE:ID="PreRoll_Ident_Open",START-DATE="2016-12-14T120000.000z",DURATION=3,X-PlayHeadStart="0.000",X-AdID="AA-1QPN49M9H2112",X-TRANSACTION-VPRN-ID="1486060788",X-TrackingDefault="1",X-TrackingDefaultURI="http,//606ca.v.fwmrm.net/ad/l/1?s=g015&n=394953%3B394953&t=1485791181366184015&f=&r=394953&adid=15914070&reid=5469372&arid=0&auid=&cn=defaultImpression&et=i&_cc=15914070,5469372,,,1485791181,1&tpos=0&iw=&uxnw=394953&uxss=sg579054&uxct=4&metr=1031&init=1&vcid2=394953%3A466c5842-0cce-4a16-9f8b-a428e479b875&cr="s=0&iw=&uxnw=394953&uxss=sg579054&uxct=4&metr=1031&init=1&vcid2=394953%3A466c5842-0cce-4a16-9f8b-a428e479b875&cr='
// Regex looks for any alpha character, colon, or hyphen before a =, then captures anything between the quotes and an optional comma after
var pattern = /([A-Za-z:-]+)="([^"]+)",?/g;
// Iterate the string using exec() and build the object along the way
var match;
var output = {};
while (match = pattern.exec(input)) {
output[match[1]] = match[2];
}
console.dir(output);
这是一个可能的解决方案。您在双引号上拆分字符串(这当然假定您在值中没有转义双引号)。然后循环遍历结果数组,将第 i 个值设置为键,将第 i+1 个值设置为该键的值。代码如下:
strings=nonparsed.split('"');
myObj={};
myObj[strings[0].slice(0,-1)]=strings[1];
for(i=2;i<strings.length;i+=2)myObj[strings[i].slice(1,-1)]=strings[i+1];
看起来唯一打乱可预测模式的 属性 是 DURATION
,它后面跟着一个数字。否则,您可以依赖交替 ="
和 ",
.
的天真模式
你可以这样做
str = str.replace(/DURATION=(\d+)/, `DURATION=""`);
return str.split('",').reduce((acc, entry) => {
let key = `'${entry.split('="')[0]}'`;
let value = `'${entry.split('="')[1]}'`;
acc[key] = value;
return acc;
}, {});
如果需要,然后在最后添加一些逻辑来整理持续时间。
试图找到从大字符串中提取值的最有效方法。
EXT-X-DATERANGE:ID="PreRoll_Ident_Open",START-DATE="2016-12-14T120000.000z",DURATION=3,X-PlayHeadStart="0.000",X-AdID="AA-1QPN49M9H2112",X-TRANSACTION-VPRN-ID="1486060788",X-TrackingDefault="1",X-TrackingDefaultURI="http,//606ca.v.fwmrm.net/ad/l/1?s=g015&n=394953%3B394953&t=1485791181366184015&f=&r=394953&adid=15914070&reid=5469372&arid=0&auid=&cn=defaultImpression&et=i&_cc=15914070,5469372,,,1485791181,1&tpos=0&iw=&uxnw=394953&uxss=sg579054&uxct=4&metr=1031&init=1&vcid2=394953%3A466c5842-0cce-4a16-9f8b-a428e479b875&cr="s=0&iw=&uxnw=394953&uxss=sg579054&uxct=4&metr=1031&init=1&vcid2=394953%3A466c5842-0cce-4a16-9f8b-a428e479b875&cr="
我以上面为例。 这个想法是提取 : 之前的所有大写字符串作为对象键,引号之间的所有内容直到下一个逗号作为其值。然后迭代整个字符串,直到创建此对象。
nonParsed.substring(nonParsed.lastIndexOf("="")+1, nonParsed.lastIndexOf("","));
我一开始就有这个概念,但如果有人帮助我迭代并提高效率,我们将不胜感激。
最终输出类似于 --
{
'EXT-X-DATERANGE:ID': 'PreRoll_Ident_Open',
'START-DATE': '2016-12-14T120000.000z',
'DURATION': '3',
...
}
headers 似乎有混合大小写的字符串,而不仅仅是大写。我会根据 = 字符查找 key-value 对。您可以构造一个正则表达式并使用 exec() 方法进行迭代并构建您的 object.
var input = 'EXT-X-DATERANGE:ID="PreRoll_Ident_Open",START-DATE="2016-12-14T120000.000z",DURATION=3,X-PlayHeadStart="0.000",X-AdID="AA-1QPN49M9H2112",X-TRANSACTION-VPRN-ID="1486060788",X-TrackingDefault="1",X-TrackingDefaultURI="http,//606ca.v.fwmrm.net/ad/l/1?s=g015&n=394953%3B394953&t=1485791181366184015&f=&r=394953&adid=15914070&reid=5469372&arid=0&auid=&cn=defaultImpression&et=i&_cc=15914070,5469372,,,1485791181,1&tpos=0&iw=&uxnw=394953&uxss=sg579054&uxct=4&metr=1031&init=1&vcid2=394953%3A466c5842-0cce-4a16-9f8b-a428e479b875&cr="s=0&iw=&uxnw=394953&uxss=sg579054&uxct=4&metr=1031&init=1&vcid2=394953%3A466c5842-0cce-4a16-9f8b-a428e479b875&cr='
// Regex looks for any alpha character, colon, or hyphen before a =, then captures anything between the quotes and an optional comma after
var pattern = /([A-Za-z:-]+)="([^"]+)",?/g;
// Iterate the string using exec() and build the object along the way
var match;
var output = {};
while (match = pattern.exec(input)) {
output[match[1]] = match[2];
}
console.dir(output);
这是一个可能的解决方案。您在双引号上拆分字符串(这当然假定您在值中没有转义双引号)。然后循环遍历结果数组,将第 i 个值设置为键,将第 i+1 个值设置为该键的值。代码如下:
strings=nonparsed.split('"');
myObj={};
myObj[strings[0].slice(0,-1)]=strings[1];
for(i=2;i<strings.length;i+=2)myObj[strings[i].slice(1,-1)]=strings[i+1];
看起来唯一打乱可预测模式的 属性 是 DURATION
,它后面跟着一个数字。否则,您可以依赖交替 ="
和 ",
.
你可以这样做
str = str.replace(/DURATION=(\d+)/, `DURATION=""`);
return str.split('",').reduce((acc, entry) => {
let key = `'${entry.split('="')[0]}'`;
let value = `'${entry.split('="')[1]}'`;
acc[key] = value;
return acc;
}, {});
如果需要,然后在最后添加一些逻辑来整理持续时间。