我正在寻找一个匹配来自多行不包含某些单词/字符的字符串的正则表达式。
就我而言,它是用于重构HTML模板文件。我必须删除内嵌样式,除非它们包含display:none;
或$TEMPLATE_VARIABLE
。为此,我试图使用来自Netbeans的正则表达式的搜索和替换功能。
我首先得到的是:
style="[^"(?!\$)]*"
Regex Test 1这匹配所有不包含模板变量的样式声明,但遗憾的是包含display:none
。
经过一番研究后,我想出了以下内容:
style="(?!display\s*:\s*none)[^"(?!\$)]*"
Regex Test 2这样可行,直到样式声明中的某些内容先于display:none
样式。
尝试使用负面观察和前瞻的不同方法并不会带来成功。例如:
style="(?!.*(\$|display)).*"
Regex Test 3这似乎乍一看但有几个问题:样式定义后面的其他HTML元素属性与样式定义匹配,如果在样式定义之后的某处使用了模板变量与那种风格不相称。
有没有人知道正则表达式必须如何看待它才能改变这个
<span style="border: 1px solid red">Test</span>
<form style="border: 1px solid black" method="POST">
<span style="color:red; $TEMPLATE_VARIABLE"><span style="background-color:blue;" >Test</span>Test</span>
<div style="display: none;">
<span style="color: green; display: none;">Test</span>
<span style="display: inline-block">Test $NOT_STYLING_TEMPLATE_VARIABLE</span>
</div>
</form>
进入这个?
<span>Test</span>
<form method="POST">
<span style="color:red; $TEMPLATE_VARIABLE"><span>Test</span>Test</span>
<div style="display: none;">
<span style="color: green; display: none;">Test</span>
<span">Test $NOT_STYLING_TEMPLATE_VARIABLE</span>
</div>
</form>
使用display:none
或模板变量的其余样式将手动清除。
提前致谢!
答案 0 :(得分:5)
您不应该使用正则表达式来解析HTML,但我会在正则表达式中回答它,因为您在正则表达式中指定了答案并且未指定任何其他语言。
此外,我建议将正则表达式中的\$
更改为\$\w+
,因为a[href$=".pdf"]
是有效的CSS,您可能会神奇地捕捉到这样的内容(虽然我不确定如何,但我相信你可以有创意。它确实增加了一些预防措施。
P.S你的正则表达非常接近。在正则表达式.
将匹配任何字符。我已将其更改为[^"]
,因为问题是.
也在捕获"
。
\s*style="(?![^"]*(\$|display:\s*none))[^"]*"(?:\s*(?=>))?
<span style="border: 1px solid red">Test</span>
<form style="border: 1px solid black" method="POST">
<span style="color:red; $TEMPLATE_VARIABLE"><span style="background-color:blue;" >Test</span>Test</span>
<div style="display: none;">
<span style="color: green; display: none;">Test</span>
<span style="display: inline-block">Test $NOT_STYLING_TEMPLATE_VARIABLE</span>
</div>
</form>
<span>Test</span>
<form method="POST">
<span style="color:red; $TEMPLATE_VARIABLE"><span>Test</span>Test</span>
<div style="display: none;">
<span style="color: green; display: none;">Test</span>
<span>Test $NOT_STYLING_TEMPLATE_VARIABLE</span>
</div>
</form>
\s*
任意次数匹配任何空格字符style="
按字面意思匹配此字符串(?![^"]*(\$|display:\s*none))
否定前瞻,确保后面的内容与以下内容不符
[^"]*
匹配除"
(\$|display:\s*none)
匹配以下任一项
\$
按字面意思匹配$
display:\s*none
按字面意思匹配display:
,后跟任意数量的空白字符,然后依次为none
[^"]*
匹配除"
"
按字面意思匹配"
(?:\s*(?=>))?
如果正前瞻为真,则可能匹配任何后续空白字符(如果后面的字符为>
) - 当没有任何其他属性后,这将删除额外的空格