javascript - 在Javascript中按html元素拆分
问题描述
我有一堆通常看起来像这样的字符串:
string 1<div>string 2<br></div>string 3
string 1<div>string 2<br></div><div>string 3<br></div>
<div>string 1<br></div><div>string 2<br></div><div>string 3<br></div>
我需要将文本(元素内部和外部/元素之间,如上所示)提取到这样的数组中:
['string 1', 'string 2', 'string 3']
有没有办法在纯 Javascript 中做到这一点?
我试过这样的事情:
console.log(text.split(/<div>(.*)<br><\/div>/g))
但它只适用于第一个:
[ 'string 1', 'string 2', 'string 3' ]
虽然它在最后两个变体上失败了:
[ 'string 1', 'string 2<br></div><div>string 3', '' ]
[ '', 'string 1<br></div><div>string 2<br></div><div>string 3', '' ]
解决方案
在解析 HTML 方面,纯 JavaScript 方法通常比正则表达式更好。您可以创建一个template
元素,将 HTML 加载到其中,然后用于Array.filter
获取所有作为文本节点的子节点,最后返回它们的textContent
:
const html = [
'string 1<div>string 2<br></div>string 3',
'string 1<div>string 2<br></div><div>string 3<br></div>',
'<div>string 1<br></div><div>string 2<br></div><div>string 3<br></div>'
]
const getTextContent = (html) => {
let tmp = document.createElement('template');
tmp.innerHTML = html;
const textNodes = [].filter.call(tmp.content.childNodes, n => n.nodeType = Node.TEXT_NODE);
return textNodes.map(o => o.textContent);
}
html.forEach(h => console.log(getTextContent(h)));
推荐阅读
- java - 迭代一个集合,然后只执行一次流连接集合的所有元素
- c++ - 为什么这个输出“geeksforgeeks”?
- c - 在 AVR 工作室中将温度转换为电压
- jquery - jQuery datepicker 在点击时不起作用
- android - 无法实现拖放
- mysql - 使用 where 类中的同一表更新表
- validation - 如何在 Ag-Grid 中实现验证?
- java - 使用 java servlet 上传文件导致找不到资源
- bash - 期望脚本在后台运行远程脚本
- java - Team Foundation Server 与 TFS 数据库(SQL Server)的连接过多