首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否根据特定的标签将HTML字符串拆分成部分?

是否根据特定的标签将HTML字符串拆分成部分?
EN

Stack Overflow用户
提问于 2018-06-30 20:25:20
回答 2查看 301关注 0票数 1

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

代码语言:javascript
复制
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,根据章节将其拆分,如下所示:

代码语言:javascript
复制
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上使用正则表达式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-30 21:16:09

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

代码语言:javascript
复制
//get all elements until the next h1 is encountered
$('h1').nextUntil('h1')

使用它,您可以对h1集合执行map()操作,获取每组内容,最后创建您的对象

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2018-06-30 20:34:49

一种方法是使用一系列的数组对字符串进行排序并将其分成几个部分,然后进行一些清理,并通过映射初始的“断开的”字符串并在内部再次拆分来构建一个新的split,从而获得(干净的)标题和内容

代码语言:javascript
复制
var 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>`;


var chapters = bookString.split('<h1>').filter(n => n).map(text => {
  var cut = text.replace(/\n/g, '').split(': ')[1].split('</h1>');
  return {
    title   : cut[0],
    content : cut[1]
  }
});

console.log(chapters);

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51114918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档