态
我正在寻找一种方法(或正则态度),从给定的字符串中提取键值对及其值。例如:
var text = "<script src="a" integrity="b" crossorigin="c" exclude="d"><//script>";
var reg = '...';
var res = reg.exec(text);
Result: { 'src': 'a', 'integrity': 'b', 'crossdomain': 'c', 'exclude': 'd' }
请注意重要的事情:
- 与DOM无关。
- "文本"参数是纯文本,没有与DOM的任何连接。(我从服务器获得)。
- 这条文本根本不应该插入DOM。
您需要做的就是创建一个HTML元素,将字符串设置为InnerHTML并在其上使用标准DOM方法 - 随时随地仍然没有任何添加到DOM:p>
var el = document.createElement('html');
el.innerHTML = '<script src="a" integrity="b" crossorigin="c" exclude="d"><//script>';
console.log(el.getElementsByTagName('script')[0].attributes)
要获取属性名称和值,请使用以下内容(请注意下面使用ES6):
var el = document.createElement('html');
el.innerHTML = '<script src="a" integrity="b" crossorigin="c" exclude="d"><//script>';
var attrs = Array.from(el.getElementsByTagName('script')[0].attributes);
for (let attr of attrs) {
console.log(attr.name + "=" + attr.value);
}
ES5等效是:
Array.prototype.forEach.call(el.getElementsByTagName('script')[0].attributes, function(e) {
console.log(e.name + " = " + e.value);
});
要获取您要的对象,您可以使用以下内容:
var el = document.createElement('html');
el.innerHTML = '<script src="a" integrity="b" crossorigin="c" exclude="d"><//script>';
var obj = Array.from(el.getElementsByTagName('script')[0].attributes).reduce((a,b) => {
a[b.name] = b.value;
return a;
}, {});
console.log(obj);
要达到您的结果,我们可以首先用正则提取属性:
var text = '<script src="a" integrity="b" crossorigin="c" exclude="d"><//script>';
var attributes = text.match(/b(w+)="(.*?)"/g);
var result = {};
attributes.forEach(attr => {
attr.replace(/"/g,'') // Remove quotes from attributes
var htmlAttribute = attr.split('=')[0];
var htmlValue = attr.split('=')[1];
result[htmlAttribute] = htmlValue;
});
console.log(result); // Your object with key:value
// remember the 'g' flag, otherwise ...
var r = /b(w+)s*=s*"(.*?)"/g;
var s = '<script src="a" integrity="b" crossorigin="c" exclude="d"><//script>';
var d = {};
// ... this loop will run indefinitely!
var m = r.exec(s);
while (m) {
d[m[1]] = m[2];
m = r.exec(s);
}
d; // { src: "a", integrity: "b", crossorigin: "c", exclude: "d" }