HTMLタグの範囲を特定する正規表現

stylescriptのような入れ子にならない前提のタグなら、このような正規表現で範囲特定して抜き出したり置き換えたりできます。

match(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/g);

たとえば、HTMLソース内に散在しているstyleタグを1箇所にまとめるならこんなふうに使います。

const styles = html
    .match(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/g)
    .map(
      v => v.match(/<style[^>]*>(\b[^<]*(?:(?!<\/style>)<[^<]*)*)<\/style>/i)[1]
    );
  const style = '<style>' + styles.join('') + '</style>';

html = html.replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi, '');
html = html.replace('</head>', style + '</head>');

関連記事