You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将HTML标签字符串转换为数组?

解决方案:无DOM解析拆分HTML字符串为标签数组

我懂你要做的事——把一段HTML字符串拆成一个个独立标签元素的数组,还要完整保留每个标签里的文本和属性,而且不想碰DOM解析,毕竟你只是用来展示这些标签文本,不是真的要渲染成HTML元素对吧?之前你参考的方案会剥离内部文本,那咱们换个思路,用正则或者字符串遍历的方式来实现。

方案一:正则表达式(简单高效,适合规整HTML)

如果你的HTML结构比较标准,没有同类型标签嵌套的情况,正则是最省心的选择。我们可以写一个正则,精准匹配从开始标签到对应闭合标签的完整内容,包括内部文本和属性。

代码示例

const htmlStr = '<div>This</div><h1>Is</h1> <p>A</p> <a href="#">Test</a>';
// 正则说明:匹配成对的HTML标签,保留完整内容
const tagRegex = /<([a-z][a-z0-9]*)\b[^>]*>.*?<\/\1>/gi;
// 执行匹配,没有匹配到就返回空数组
const tagArray = htmlStr.match(tagRegex) || [];

console.log(tagArray);
// 输出结果:["<div>This</div>", "<h1>Is</h1>", "<p>A</p>", "<a href="#">Test</a>"]

正则细节解释

  • <([a-z][a-z0-9]*)\b:捕获开始标签的标签名,确保匹配合法的HTML标签开头
  • [^>]*>:匹配标签内的所有属性,直到标签闭合的>
  • .*?:非贪婪匹配内部文本,避免跨标签匹配(比如不会把<div>1</div><div>2</div>当成一个整体)
  • <\/\1>:匹配对应的闭合标签,\1引用之前捕获的标签名,保证开闭标签一致

扩展:支持自闭合标签

如果你的HTML里有<img>、<br>这类自闭合标签,可以修改正则,加入对自闭合标签的匹配:

const tagRegex = /<([a-z][a-z0-9]*)\b[^>]*>.*?<\/\1>|<([a-z][a-z0-9]*)\b[^>]*\/>/gi;

方案二:字符串遍历(更稳健,适合复杂场景)

如果担心正则的局限性(比如遇到同标签嵌套的情况),可以用手动遍历字符串的方式,跟踪标签的开闭位置,这种方式更灵活,也能处理一些边缘情况。

代码示例

function splitHtmlToTagArray(htmlStr) {
  const result = [];
  let currentIndex = 0;
  const strLength = htmlStr.length;

  while (currentIndex < strLength) {
    // 找到下一个开始标签的起始位置
    const startTagStart = htmlStr.indexOf('<', currentIndex);
    if (startTagStart === -1) break;

    // 找到开始标签的结束位置
    const startTagEnd = htmlStr.indexOf('>', startTagStart);
    if (startTagEnd === -1) break;

    // 提取标签名
    const tagNameMatch = htmlStr.slice(startTagStart + 1, startTagEnd).match(/^([a-z][a-z0-9]*)/i);
    if (!tagNameMatch) {
      currentIndex = startTagEnd + 1;
      continue;
    }
    const tagName = tagNameMatch[1].toLowerCase();

    // 寻找对应的闭合标签
    const closingTag = `</${tagName}>`;
    const closingTagStart = htmlStr.indexOf(closingTag, startTagEnd);

    if (closingTagStart === -1) {
      // 没有找到闭合标签,判定为自闭合标签,直接截取
      result.push(htmlStr.slice(startTagStart, startTagEnd + 1));
      currentIndex = startTagEnd + 1;
    } else {
      // 截取完整的标签内容(从开始标签到闭合标签结束)
      const closingTagEnd = closingTagStart + closingTag.length;
      result.push(htmlStr.slice(startTagStart, closingTagEnd));
      currentIndex = closingTagEnd;
    }
  }

  return result;
}

// 测试
const htmlStr = '<div>This</div><h1>Is</h1> <p>A</p> <a href="#">Test</a>';
console.log(splitHtmlToTagArray(htmlStr));
// 输出结果:["<div>This</div>", "<h1>Is</h1>", "<p>A</p>", "<a href="#">Test</a>"]

优势说明

这个方法不需要依赖正则的匹配规则,而是手动定位每个标签的位置,对于一些正则难以处理的情况(比如标签内有特殊字符),兼容性更好。如果需要处理嵌套同类型标签,还可以扩展成用栈来跟踪标签层级,不过对于你只是展示文本的需求,上面的代码已经足够用了。

注意事项

  • 两种方案都假设你的HTML字符串没有严重的语法错误(比如未闭合的标签、错误的标签名),如果有这类情况,可能需要额外的错误处理逻辑。
  • 标签之间的空格会被自动忽略,因为我们只截取匹配到的标签内容,空格不在匹配范围内。

内容的提问来源于stack exchange,提问作者d13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:32:44