将标签和内部数据转换为键值对

时间:2016-12-06 22:07:52

标签: javascript regex

模式

<DISTURBED>Open your eyes</DISTURBED><Field Two>See through the disguise</Field Two>

regular expression I'm using只给我最后的结果:

(<([\w\s?[^>]*)>([\w\s?]*)<\/[\w\s?[^>]*>)*

输出

我需要将所有数据提取到键值对中。在这种情况下:

{"DISTURBED": "Open your eyes", "Field Two": "See through the disguise" }

另一种可能的输出可能是:

{"DISTURBED": "Open your eyes", "Field Two": "See through the disguise", "KeyNameX": "Value output Y" }

一般规则

  • 理论上支持任何#{1}}值。实际上,没有必要支持&gt;遵循这种模式的50个标签:

    <tag name>inner content</tag name>

  • 嵌套是非法的:

    <tag>value</tag><tag2>value</tag2><tag3>...<tag50>content</tag50> //没有

  • 这不是HTML。您将看不到属性值。

  • 字符支持仅限于单词和空格。不#34;!@#$%^&amp; *()_ =&#34;等

3 个答案:

答案 0 :(得分:3)

这个怎么样?

const re = /<([\w\s]+)>(.+?)<\/\1>/g

JavaScript的正则表达式支持反向引用。

然后你可以在匹配时循环:

const string = "<DISTURBED>Open your eyes</DISTURBED>...";
const tags = {};
for (let match; match = re.exec(string);) {
    tags[match[1]] = match[2];
}

答案 1 :(得分:1)

您可以创建一个元素,使用0.innerHTML.tagName.textContent来包含,将.replace()字符替换为_保留空间特征。

.tagName

答案 2 :(得分:0)

我遇到了很多问题,并决定抛出正则表达式的想法。我写了this而不是我称之为标记化器的东西:

&#13;
&#13;
   var workingObject = {
  content: "<DISTURBED>Open your eyes</DISTURBED><Field Two>See through the disguise</Field Two><Field Two three>See through the disguise</Field Two three><hi>asdf</hi>",
  result: {}
}

function tokenizer(input){    
  var token;
  var index = 0;
  input.content = input.content.trim();
    
  do{
    token = input.content.substring(0,1);
    input.content = input.content.substring(1, input.content.length);
    
    var tagName = extract(input, '>');
    var tagContent = extract(input, '<');
    var discard = extract(input, '>');
    
    //input.result['"' + tagName + '"'] = {tagContent, index};//optionally add index 
    input.result['"' + tagName + '"'] = tagContent;    
    index++;
  }while(token = '<' && input.content != "");
  
  console.log('final result: ', input.result);
}

function extract(input, delimiter){
  var result = [];
  var token;  
  
  do{
    result.push(token);        
    token =  input.content.substring(0,1);
    input.content =  input.content.substring(1, input.content.length);
  }while(token != delimiter && input.content != "");
  
  result = result.join("");
  return result;
}

tokenizer(workingObject);
&#13;
&#13;
&#13;

它有点灵活,因为我不必担心像正则表达式那样的角色细节。即使使用意外格式,输入也会大部分处理。

相关问题