1

我有非常大的 HTML,如果将其解析为 DOM 树,将花费很多时间,因此尽管“正确”,但此选项不可用。我需要删除所有内部标记样式声明。

有一个正则表达式似乎在大多数情况下都有效:

> re
/\sstyle\s*=(\"[^\">]*\"*|\'[^\'>]*\'*|[^\s>]*)/gi
> test
[ '<img src="some.jpg" style="width:auto" width="50" height="60">',
  '<img style=\'width:auto\'>',
  '<img style=\'width:auto>',
  '<img style=width:auto>',
  '<div style=\'\'>',
  '<div style=\'background-image:url(\'paper.gif\');\'',
  '<div style=\'background-image:url(\\\'paper.gif\\\');\'' ]
> test.forEach(function(t){console.log(t.replace(re,''))})
<img src="some.jpg" width="50" height="60">
<img>
<img>
<img>
<div>
<divpaper.gif');'
<divpaper.gif\');'

如您所见,如果值部分中有重复的引号,无论是否有适当的转义,正则表达式都不起作用。有什么想法可以改进吗?

4

2 回答 2

2

查找属性的标准方法类似于/ style="[^"]+"/g[demo]

您的标记的问题在于它无处不在。正则表达式在寻找模式方面很棒。此标记没有可预测的模式。

于 2012-09-06T12:12:11.660 回答
1

为什么要编写一个大的正则表达式来一次完成所有这些工作?

将其解析为 DOM 树可能会花费太多时间,但编写一个手工制作的解析器可能会更好。

您还可以将两者混合使用:使用正则表达式来隔离每个标签(这很容易),然后解析标签内的属性,隔离(并删除)style您遇到的任何属性。

于 2012-09-06T11:57:58.857 回答