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

如何用JavaScript正则表达式提取HTML style标签内文本

如何用JavaScript正则提取转义HTML中style标签内的文本

你的代码目前没法正确提取目标内容,主要有两个问题:一是用了g全局修饰符后,match()只会返回完整的匹配字符串,拿不到捕获组里的CSS内容;二是虽然正则的基础结构没问题,但需要调整匹配方式来精准获取文本。

下面分场景给出解决方案:

单个style标签的情况

如果你的HTML里只有一个style标签,可以用不带全局修饰符的正则,通过match()的返回值获取捕获组内容:

var rawHtml = "<style type='text/css'> div { color: red; } </style>";
// 兼容带双引号属性的情况:var rawHtml = "<style type=\"text/css\"> div { color: red; } </style>";
// 兼容无属性的情况:var rawHtml = "<style> div { color: red; } </style>";

// 正则解析:
// <style[^>]*> 匹配转义后的style起始标签,[^>]*会匹配标签内所有属性(不管单/双引号)
// (.+?) 非贪婪捕获标签内的所有文本,避免过度匹配
// <\/style> 匹配转义后的结束标签
// i修饰符支持匹配<STYLE>这类大小写混合的标签
const styleRegex = /<style[^>]*>(.+?)<\/style>/i;
const matchResult = rawHtml.match(styleRegex);

if (matchResult) {
  // 取第一个捕获组的内容,trim去掉前后冗余空格
  const cssContent = matchResult[1].trim();
  console.log(cssContent); // 输出:div { color: red; }
}

多个style标签的情况

如果有多个style标签,需要用g全局修饰符配合matchAll()来获取所有匹配的捕获组内容(ES2020及以上支持):

var rawHtml = "<style type='text/css'> div { color: red; } </style><style>p { margin: 0; }</style>";
const styleRegex = /<style[^>]*>(.+?)<\/style>/gi;
// 用matchAll获取所有匹配结果
const allMatches = rawHtml.matchAll(styleRegex);
// 转换为数组并提取每个匹配的捕获组内容
const allCssContents = Array.from(allMatches).map(item => item[1].trim());

console.log(allCssContents); // 输出:["div { color: red; }", "p { margin: 0; }"]

关键细节说明

  • [^>]*的作用:这个部分会匹配任意数量的非>字符,不管style标签里的属性是单引号、双引号还是没有属性,都能完整匹配起始标签,不会因为引号类型出问题。
  • 非贪婪量词+?:如果用贪婪的+,当有多个style标签时,会从第一个起始标签匹配到最后一个结束标签,导致内容错误。+?会匹配到最近的结束标签,保证每个style标签的内容独立提取。

更健壮的替代方案

如果你的HTML结构复杂(比如style标签里有注释、转义嵌套等),正则可能会失效,这时可以把转义的HTML还原成真实HTML,用DOM方法提取:

var rawHtml = "<style type='text/css'> div { color: red; } </style>";
// 把转义的HTML解码为真实内容
const decodedHtml = decodeURIComponent(rawHtml);
// 用DOMParser解析HTML
const parser = new DOMParser();
const doc = parser.parseFromString(decodedHtml, 'text/html');
// 获取所有style元素并提取文本内容
const styleElements = doc.querySelectorAll('style');
const cssContents = Array.from(styleElements).map(el => el.textContent.trim());

console.log(cssContents);

这种方法完全不用考虑正则的边界情况,适配绝大多数复杂场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:12:24