使用正则表达式从给定字符串中提取键值对属性

时间:2017-03-08 15:21:34

标签: javascript regex

我正在寻找一种方法(或正则表达式模式)从给定字符串中提取键值对属性及其值。 e.g:

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' }

请注意重要事项:

  1. 与DOM无关。
  2. &#39;文字&#39;参数是纯文本,没有任何与DOM的连接。 (我是从服务器上得到的)。
  3. 这行文字根本不会被插入到DOM中。

3 个答案:

答案 0 :(得分:2)

你需要做的就是创建一个html元素,将你的字符串设置为innerHTML并在其上使用标准DOM方法 - 在任何时候都没有添加到DOM中:

&#13;
&#13;
var el = document.createElement('html');
el.innerHTML = '<script src="a" integrity="b" crossorigin="c" exclude="d"><//script>';

console.log(el.getElementsByTagName('script')[0].attributes)
&#13;
&#13;
&#13;

要获取属性名称和值,请使用以下内容(请注意,下面使用es6):

&#13;
&#13;
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);
}
&#13;
&#13;
&#13;

ES5等效于:

Array.prototype.forEach.call(el.getElementsByTagName('script')[0].attributes, function(e) {
    console.log(e.name + " = " + e.value);
});

要获取您要求的对象,您可以使用以下内容:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

为了达到你的结果,我们可以先用正则表达式提取属性:

&#13;
&#13;
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
&#13;
&#13;
&#13;

答案 2 :(得分:0)

@FrenchMajesty无需拆分/删除,你也可以使用原始正则表达式:

// 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" }