如何从字符串中分离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", "<script src=\"http://foo.com/script.js\"></script>", "\n\nEtiam porta sem malesuada magna mollis euismod. Vestibulum id ligula porta felis euismod semper.\n\n", "<script>var x = 'a';</script>", "\n\nNulla vitae elit libero, a pharetra augue. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.", ]即把script标签与普通文本分离后放入同一个数组,请问该如何实现?
嘿,这个需求用正则结合字符串处理就能搞定,我给你写个JavaScript的实现方案,亲测可以得到你想要的结果:
实现思路
核心是先匹配出所有转义后的<script>标签(注意你的字符串里是<代替了<),然后把原字符串按这些标签分割成普通文本片段,最后交替合并文本和标签,同时给文本添加要求的\n\n格式。
代码实现
const originalStr = '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.'; // 匹配所有转义后的script标签(包含属性和内部代码) const scriptRegex = /(<script.*?><\/script>)/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);
代码说明
- 正则匹配:
/(<script.*?><\/script>)/g用来精准匹配所有转义后的script标签,.*?是非贪婪匹配,避免把多个script标签当成一个匹配。 - 分割与提取:用
match提取所有script标签,split得到分割后的文本片段,这样文本片段的数量刚好比script标签多1(对应标签前、标签间、标签后的文本)。 - 格式处理:根据文本片段的位置(第一个、中间、最后一个)添加不同的
\n\n格式,确保和你想要的数组结构一致。 - 空值处理:用
trim()和判断跳过空文本片段,避免数组里出现无效的空字符串。
运行这段代码,就能得到你给出的目标数组啦~
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

