2

我正在从一些 html 中删除所有样式属性。我可以使用正则表达式

/style=("[^"]"|'[^']')/

但我想知道这是否效率低下(由于负匹配)。我也知道它容易受到包含引号的样式属性(例如背景图像)的影响。

是否有一个正则表达式我可以用来匹配有效的样式字符串,或者像用正则表达式解析 html 一样,这对于一个正则表达式来说是否太难了?

*edit 这是(我认为)我正在抓取的 html 中最棘手的样式字符串

style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'"
4

4 回答 4

1

我不认为,否定匹配在每种情况下都很慢。style=毕竟,当您提供带有以下字节的起点时,无论如何都会将其与模式进行比较。

但是,您必须满足属性用引号括起来的情况。

/style=(".*?"|'.*?'|[^"'][^\s]*)/s

应该匹配所有 HTML 属性语法的产生。但是,请确保点匹配正则表达式引擎中的所有字符,包括换行符(因此是/s)。我还使用了非贪婪量词*?。这些也可能不实施。

style=没有任何跟随值的特殊情况,上面没有表示以使其更简单。

于 2012-04-17T11:19:15.433 回答
0

尝试/ style\=[\"\']?([a-zA-Z0-9 \:\-\#\(\)\.\_\/\;\'\,]+)\;?[\"\']? /ig

它应该找到我知道的每个样式属性。

http://jsfiddle.net/DULyx/3/ - 在这里查看

于 2012-04-17T10:39:45.150 回答
0

您不应该将 HTML 作为字符串处理。你在 JS 中所需要的只是elt.style='';. 如果您有机会通过 XSLT 运行您的东西,那么它是单行的。

于 2012-12-01T02:53:27.667 回答
0
function trim (str) {
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

function getStyle(element){
    return parseRules(element.getAttribute('style'))
}

function parseRules(rules){
  var parsed_rules= {}
      rules.split(';').map(function(rule){
          return rule.split(':').map(function(rule,index){
            // HERE YOU CAN TRY TO CLEAN THE RULES
            return trim( rule )
          })
      }).filter( function(rule){
            // HERE YOU CAN TEST THAT THE RULE IS VALID
          return rule.length == 2 && ( (rule[0]!="") || (rule[1]!="") )
      }).forEach(function(rule){
        parsed_rules[rule[0]] = rule[1]
      })


  return parsed_rules
}
于 2014-03-18T06:32:46.740 回答