RegEx匹配HTML样式标记的开头,内容和结束

时间:2011-04-23 07:53:59

标签: html regex

嘿大家, 我正在接受另一次编码冒险。我开始今天早些时候自学一些基本的正则表达式,并取得其输入HTML文件和正则表达式的一个列表框有点C#应用程序,然后使用这些正则表达式替换或删除HTML标签。 我设法让一些功能正则表达式清理和删除标签乱抛垃圾的表,但我还需要删除的硬编码的CSS样式的混乱,并与外部的人引用替换它们。 经过大量的反复试验后,我终于提出了从<style type="text/css"></style>的内容,但由于某种原因,它完全跳过了单独的样式标记块。但它会在最后一个关闭时停止。 这更多的是比信息的需要有点好奇,这应该正常工作,现在因为我可以代替的是具有单一<link>到外部CSS相匹配。 截至目前,我的RegEx是这样的:

<style((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)>(.*?\r\n)*(</style>)

在第一半,由here,中间位是我挣扎最有,因为我已经忘记了采取\ r \ n和课程的结束标记是逐字。

就像我说的,这很好用,我唯一的疑问就是这段代码:

<style type="text/css">
<!--
#wrapper #content #main2col .modbox tr td {
    color: #3366cc;
    border-top-style: solid;
    border-right-style: solid;
    border-bottom-style: solid;
    border-left-style: solid;
}
#wrapper #content #main2col .modbox tr td p em {
    color: #0a304e;
}
#wrapper #content #main2col .modbox tr td em br {
    color: #0a304e;
}
#wrapper #content #main2col .modbox tr td em strong {
    color: #0a304e;
}
#wrapper #content #main2col p strong {
    color: #0a304e;
}
#wrapper #content #main2col table tr td strong {
    color: #0a304e;
}
-->
</style>
<style type="text/css">
<!--
table.modbox {
    font-size:9pt;
    font-HCMmily:"Calibri", "sans-serif";
    border-top-style: solid;
    border-right-style: solid;
}
p.modbox {
    margin-top:0in;
    margin-right:0in;
    margin-bottom:10.0pt;
    margin-left:0in;
    line-height:normal;
    font-size:11.0pt;
    font-HCMmily:"Calibri", "sans-serif";
}
#wrapper #content #main2col .modbox tr .modbox {
    color: #09C;
    font-style: normal;
}
#wrapper #content #main2col .modbox {
    color: #3366cc;
}
#wrapper #content #main2col .modbox {
    color: #3a5774;
}
#wrapper #content #main2col .modbox tr .modbox .MsoNormal .modbox {
    color: #3a5774;
}
#wrapper #content #main2col .modbox {
    color: #3a5774;
}
-->
</style>
<style type="text/css">
<!--
table.MsoTableGrid {
    border:solid;
    font-size:11.0pt;
    font-HCMmily:"Calibri", "sans-serif";
}
p.MsoNormal {
    margin-top:0in;
    margin-right:0in;
    margin-bottom:5pt;
    margin-left:0in;
    line-height:normal;
    font-size:10pt;
    font-HCMmily:"Calibri", "sans-serif";
}
-->
</style>
<style type="text/css">
<!--
table.modbox {
font-size:10.0pt;
font-family:"Times New Roman","serif";
}
-->
</style>

仅返回一个匹配项。我试图弄清楚为什么它没有抓住</style>的第一个标记。为了记录,我尝试添加(\ r \ n)?在关闭标记位之后,但没有区别。

同样,今天是我与RegEx合作的第一天,所以我对此非常陌生,我可能会犯一个非常简单的错误。

谁能解释我做错了什么?非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

我会说你的正则表达式有贪婪问题。最有可能的是你应该检查你所有的星星(*)和加号(+)以在它们之后添加一个询问标记(?)。像

 (.*?\r\n)* => (.*?\r\n)*?

另一方面,想要使用正则表达式解析html / xml是一个坏主意,为什么不使用简单的html解析器并检索标记的内容?