Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式匹配html样式属性的有效值_Javascript_Css_Regex_Styles - Fatal编程技术网

Javascript 正则表达式匹配html样式属性的有效值

Javascript 正则表达式匹配html样式属性的有效值,javascript,css,regex,styles,Javascript,Css,Regex,Styles,我正在从一些html中剥离所有样式属性。我可以用正则表达式 /style=("[^"]"|'[^']')/ 但我想知道这是否是低效的(由于负匹配)。我也知道它很容易受到可能包含引号的样式属性(例如背景图像)的影响 是否有一个正则表达式我可以用来匹配有效的样式字符串,或者,像用正则表达式解析html一样,这是一个正则表达式通常难以执行的任务 *“编辑在这里”(我认为)是我正在抓取的html中最棘手的样式字符串 style="FONT-SIZE: 10pt; COLOR: black; FONT-

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

/style=("[^"]"|'[^']')/
但我想知道这是否是低效的(由于负匹配)。我也知道它很容易受到可能包含引号的样式属性(例如背景图像)的影响

是否有一个正则表达式我可以用来匹配有效的样式字符串,或者,像用正则表达式解析html一样,这是一个正则表达式通常难以执行的任务

*“编辑在这里”(我认为)是我正在抓取的html中最棘手的样式字符串

style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'"
试试
/style\=[\“\'”]?([a-zA-Z0-9\:\-\\\\\(\)\.\\\/\\',]+)\;?[\“\']/ig

它应该能找到我知道的每一个风格属性


-检查这里

我不认为负匹配在任何情况下都很慢。毕竟,当您使用
style=
提供起始点时,以下字节将与模式进行比较

但是,您必须满足属性不包含在引号中的情况

/style=(".*?"|'.*?'|[^"'][^\s]*)/s
应该匹配HTML属性语法的所有结果。但是,请确保点匹配正则表达式引擎中的所有字符,包括换行符(因此是
/s
)。我还使用了非贪婪量词
*?
。这些也可能无法实现


有一个特例是
style=
,它没有任何以下值,为了使它更简单,上面没有描述它。

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

@Sibster我知道这个问题和答案,但我的问题比这窄得多。你可能想查看我的更新答案。@wheresrhys你也可以有属性,不带引号:
style=font-weight:bold
是有效的。@Boldewyn如果由我决定,就不会有任何样式属性。。。但不幸的是,我不得不从第三方刮取html,因此无法控制引号是否存在
url
s可能会被引用。这很好,但在
style='FONT-FAMILY:“Verdana”
上失败了。一般来说,我认为正则表达式的形式必须是
/(“[allvalidchars and']+”|(“[allvalidchars and”]+”)/
,以避免这个陷阱,因为它意味着复制字符类或b)将其存储为字符串,并且在连接并传递到
new RegExp()之前必须正确转义
。即使如此,它也容易受到例如
style='FONT-FAMILY:\'Verdana\'
的攻击。根据您建议的案例,没有regexp可以执行此操作。因为您要定义搜索规则-规则必须由css编写器执行。一旦脚本不遵循规则,您如何搜索它?
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
}