javascript - 根据特定标签将 HTML 字符串拆分为多个部分?

标签 javascript html

我有一个代表 HTML 片段的字符串,如下所示:

const bookString = "<h1>Chapter 1: The Beginning</h1>
<p>It was a dark and stormy night...</p>
<p>Tom ran up the stairs...</p>
<p>A shot rang out!</p>

<h1>Chapter 2: A Day at the Zoo</h1>
<p>The door swung open...</p>"

你明白了,在这本书中我只希望看到 h1、p、em/strong/i/b 标签。 (这来自 Mammoth 库,它接受一个 Word 文档并给我一个 HTML 字符串。)我想编写一些 JS 根据章节将其拆分,如下所示:

const chapters = [
  {
    title: "The Beginning",
    content: 
      "<p>It was a dark and stormy night...</p>
      <p>Tom ran up the stairs...</p>
      <p>A shot rang out!</p>"
    ]
  }
];

然后我可以将其传递给电子书生成库。

我应该使用像 Cheerio 这样的 HTML 解析库来做到这一点吗?我不太清楚选择,例如“对于每个 h1,保存一个标题,然后对于该 h1 之后的每个 p,推送到数组...”或者我应该使用正则表达式,尽管常见的建议是永远不要在 HTML 上使用正则表达式?

最佳答案

如果您想使用Cheerio,您可以使用nextUntil()方法获取由传递的选择器标识的所有元素

//get all elements until the next h1 is encountered
$('h1').nextUntil('h1')

使用它,您可以在 h1 集合上 map() 获取每组内容并最终创建您的对象

const chapters = $('h1').map((index,h1)=>{
  let content = $(h1).nextUntil('h1').map((index,p)=>$.html(p)).get().join('');
  return {
    title:$(h1).html(),
    content:content
  };
}).get();

repl.it Demo

关于javascript - 根据特定标签将 HTML 字符串拆分为多个部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51114918/

相关文章:

javascript - 如何在 Nuxt.js (Vue.js) 中使用 vue-infinite-loading

html - 如何使显示 : table-cell be 100% 内的 <div> 的高度

javascript - 像图像旋转一样旋转 SVG 元素

javascript - Ajax 调用返回 viewmodel 但 View 不显示结果

JavaScript:parseFloat 计算不正确

html - 将 TD 中的 DIV 与底部对齐

html - float ul 折叠,导致子 li 相互包裹而不是排成一排

jquery - 如何在全尺寸固定背景上正确定位元素? - 针对不同的分辨率

html - 为什么在 Rails 2 中对撇号进行 HTML 编码会产生意想不到的结果?

javascript - 为什么 << 32 在 javascript 中不会导致 0?