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

如何从字符串中分离script标签,生成文本与标签混合数组?

如何将包含script标签的字符串分割为普通文本与script标签分离的数组?

假设我们有如下字符串:
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. <script src="http://foo.com/script.js"></script> Etiam porta sem malesuada magna mollis euismod. Vestibulum id ligula porta felis euismod semper. <script>var x = 'a';</script> Nulla vitae elit libero, a pharetra augue. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.

需要将其分割为如下格式的数组:

[
  "Praesent commodo cursus magna, vel scelerisque nisl consectetur et.\n\n",
  "&lt;script src=\"http://foo.com/script.js\"&gt;&lt;/script&gt;",
  "\n\nEtiam porta sem malesuada magna mollis euismod. Vestibulum id ligula porta felis euismod semper.\n\n",
  "&lt;script&gt;var x = 'a';&lt;/script&gt;",
  "\n\nNulla vitae elit libero, a pharetra augue. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.",
]

即把script标签与普通文本分离后放入同一个数组,请问该如何实现?


嘿,这个需求用正则结合字符串处理就能搞定,我给你写个JavaScript的实现方案,亲测可以得到你想要的结果:

实现思路

核心是先匹配出所有转义后的<script>标签(注意你的字符串里是&lt;代替了<),然后把原字符串按这些标签分割成普通文本片段,最后交替合并文本和标签,同时给文本添加要求的\n\n格式。

代码实现

const originalStr = 'Praesent commodo cursus magna, vel scelerisque nisl consectetur et. &lt;script src="http://foo.com/script.js"&gt;&lt;/script&gt; Etiam porta sem malesuada magna mollis euismod. Vestibulum id ligula porta felis euismod semper. &lt;script&gt;var x = \'a\';&lt;/script&gt; Nulla vitae elit libero, a pharetra augue. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.';

// 匹配所有转义后的script标签(包含属性和内部代码)
const scriptRegex = /(&lt;script.*?&gt;&lt;\/script&gt;)/g;

// 提取所有script标签片段
const scriptSegments = originalStr.match(scriptRegex) || [];
// 按script标签分割原字符串,得到普通文本数组
const textSegments = originalStr.split(scriptRegex);

const resultArray = [];

// 遍历文本片段,和script标签交替合并
for (let i = 0; i < textSegments.length; i++) {
  let currentText = textSegments[i].trim();
  // 跳过空的文本片段(避免分割后出现空字符串的情况)
  if (!currentText) continue;

  // 根据位置添加对应的\n\n格式
  if (i === 0) {
    // 第一个文本片段:结尾加\n\n
    currentText += '\n\n';
  } else if (i === textSegments.length - 1) {
    // 最后一个文本片段:开头加\n\n
    currentText = '\n\n' + currentText;
  } else {
    // 中间的文本片段:前后都加\n\n
    currentText = '\n\n' + currentText + '\n\n';
  }

  resultArray.push(currentText);

  // 如果不是最后一个文本,后面跟着对应的script标签
  if (i < scriptSegments.length) {
    resultArray.push(scriptSegments[i]);
  }
}

console.log(resultArray);

代码说明

  1. 正则匹配:/(&lt;script.*?&gt;&lt;\/script&gt;)/g 用来精准匹配所有转义后的script标签,.*?是非贪婪匹配,避免把多个script标签当成一个匹配。
  2. 分割与提取:用match提取所有script标签,split得到分割后的文本片段,这样文本片段的数量刚好比script标签多1(对应标签前、标签间、标签后的文本)。
  3. 格式处理:根据文本片段的位置(第一个、中间、最后一个)添加不同的\n\n格式,确保和你想要的数组结构一致。
  4. 空值处理:用trim()和判断跳过空文本片段,避免数组里出现无效的空字符串。

运行这段代码,就能得到你给出的目标数组啦~


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:59:33