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