使用 javascript/lodash 从输入字符串中解析 html 内容

Posted

技术标签:

【中文标题】使用 javascript/lodash 从输入字符串中解析 html 内容【英文标题】:Parse html content from an input string using javascript/lodash 【发布时间】:2018-03-01 23:25:55 【问题描述】:

我有一个这样的字符串:

var inputString = "some sample string with <span data-id='24' data-name='cat'">cat</span> and <span data-id='25' data-name='dog'">dog</span>"

我要做的是将跨度中的数据提取到 json 数组中:

var json = [
    
        id: '24',
        name: 'cat'
    ,
    
        id:'25',
        name: 'dog'
    
];

然后从字符串中去掉跨度:

var outputString = "some sample string with cat and dog";

知道如何使用纯 javascript 或 lodash 做到这一点吗?是否有一个函数可以为我提取所有跨度段,还是我需要逐步完成,从第一个元素开始查找跨度元素的索引?任何帮助将不胜感激。

【问题讨论】:

将字符串赋值给文档片段的innerhtml,然后使用DOM函数提取元素。 【参考方案1】:

您将字符串解析为 HTML,提取数据属性,然后使用 textContent 获取文本

var inputString = "some sample string with <span data-id='24' data-name='cat'>cat</span> and <span data-id='25' data-name='dog'>dog</span>";

var parser = new DOMParser();
var doc    = parser.parseFromString(inputString, "text/html");
var json   = [].slice.call(doc.querySelectorAll('span')).map(function(span) 
    return id : span.dataset.id, name : span.dataset.name;
);

var outputString = doc.body.textContent;

console.log(json);
console.log('------');
console.log(outputString);
.as-console-wrapper max-height: 100%!important; top: 0;

【讨论】:

这太棒了!你知道是否有一种简单的方法可以找到单词的开始和结束索引(例如 dog 或 cat)?狗出现的位置和猫出现在字符串中的位置(忽略跨度)。 当然,当你有字符串时,你可以使用indexOf 来获取字符串中单词的索引 嗯,好吧...我只是想知道如何仅获取跨度中单词的索引...如果字符串中的其他地方有另一只狗怎么办... 好吧,indexOf 仅获取 first 的索引,但您也可以设置起点,因此如果您开始就可以找到任意数量的匹配项通过找到一个,然后说“cat”的起始索引是 20,您可以执行 str.indexOf("cat", 21) 从字符串中的字符 21 等开始查找以找到第二个的索引,依此类推。 嗯,好的!最后一个问题——如果第二只猫是跨度中的那只怎么办?有没有办法让我知道是找第一只猫还是第二只?【参考方案2】:

另一个答案很好,肯定回答了这个问题,但我想提供一个使用正则表达式的替代答案。我不是最擅长正则表达式,但这就是我想出的......

const input = "some sample string with <span data-id='24' data-name='cat'>cat</span> and <span data-id='25' data-name='dog'>dog</span>";

const dataReg = new RegExp(/data-(\w+)=[\'|\"](\w+)[\'|\"] data-(\w+)=[\'|\"](\w+)[\'+\"]/g);

const json = [];

// get the matches and add them to the json array
while ((g = dataReg.exec(input)) !== null) 
  // we only care about matches after idx 1
  let m = ;
  m[g[1]] = g[2];
  m[g[3]] = g[4];
  json.push(m);


console.log(json); // [id: "24", name: "cat", id: "25", name: "dog"]

// strip the html
let safeStr = input.replace(/<(?:.|\n)*?>/gm, '');

console.log(safeStr);  // some sample string with cat and dog"

您可以在这里预览:https://jsbin.com/quyufoc/edit?js,console

【讨论】:

这也很棒。使用这种方法,如果我还想在输出字符串中找到每个单词(狗和猫)的开始和结束索引,我该怎么做呢? 我知道我可以使用 indexOf 函数,但万一句子中还有其他狗和猫没有包裹在 span 中,它可能会让我失望。 你想要它们在 safeStr 中的索引吗?并且您的第二条评论肯定指出了一个潜在的问题...我想您想要出现在 标记中的狗和猫的索引,但包括在出现之前删除的字符的偏移量? 是的,我只需要 safeStr 中 dog 和 cat 的索引。所以偏移量不应该包括跨度标签的东西。

以上是关于使用 javascript/lodash 从输入字符串中解析 html 内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Javascript/Lodash/ES6 中同时搜索父对象和子对象?

javascript Lodash获取嵌套对象值

javascript Lodash Debound调整大小

javascript ABS-lodash.js

javascript Lodash / Underscore排序对象键。像_.sortBy(),但在键而不是值上,返回一个对象,而不是一个数组。默认为alphan

字节流和字符流