首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获<pre> </pre>标记之间的所有内容

捕获<pre> </pre>标记之间的所有内容
EN

Stack Overflow用户
提问于 2019-02-24 12:08:03
回答 2查看 84关注 0票数 0

我正在读一个.html文件:

代码语言:javascript
复制
const htmlin = String(fs.readFileSync(inputHtml) || '');

const splitted = htmlin.split(/<pre.*>/);
splitted.shift();

const justPost = splitted.join('').split('</pre>');
justPost.pop();

但我正在寻找一种方法来匹配所有的文本

代码语言:javascript
复制
aaa <pre> xxx </pre> bbb <pre> foo </pre> ccc

也可以与外部的文本匹配。这样我就可以得到两个数组:

代码语言:javascript
复制
['aaa ', ' bbb ', ' ccc']

代码语言:javascript
复制
[' xxx ', ' foo ']

如何使用正则表达式或其他方法来完成此操作?

EN

回答 2

Stack Overflow用户

发布于 2019-02-24 12:35:52

一种方法是使用正则表达式替换函数和捕获组。

代码语言:javascript
复制
<pre>(.*?)(?=<\/pre>)|(?:^|<\/pre>)(.*?)(?=$|<pre>)

  • <pre>(.*?)(?=<\/pre>) -匹配pre标记之间的文本。( )
  • (?:^|<\/pre>)(.*?)(?=$|<pre>) g1 -匹配pre标记之外的文本。(g2)

代码语言:javascript
复制
let str = `aaa <pre> xxx </pre> bbb <pre> foo </pre> ccc`
let inner = []
let outer = []

let op = str.replace(/<pre>(.*?)(?=<\/pre>)|(?:^|<\/pre>)(.*?)(?=$|<pre>)/g, function (match,g1,g2){
  if(g1){
    inner.push(g1.trim())
  } 
  if(g2){
    outer.push(g2.trim())
  }
  return match
})

console.log(outer)
console.log(inner)

票数 2
EN

Stack Overflow用户

发布于 2019-02-24 19:42:00

您可以使用dom或domparser,而不使用regex。

例如,创建一个div并将innerHTML属性设置为您的html。然后循环子节点并获取innerHTML或textContent。

例如:

代码语言:javascript
复制
let htmlString = `aaa <pre> xxx </pre> bbb <pre> foo </pre> ccc`,
  pre = [],
  text = [];
let div = document.createElement('div');
div.innerHTML = htmlString;

div.childNodes.forEach(x => {
  if (x.nodeType === Node.TEXT_NODE) {
    text.push(x.textContent.trim())
  }
  if (x.nodeName === "PRE") {
    pre.push(x.innerHTML.trim());
  }
});

console.log(pre);
console.log(text);

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

https://stackoverflow.com/questions/54848648

复制
相关文章

相似问题

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