我需要从Dreamweaver模板中解析内容。 我正在使用C#。
以下是我需要解析的一些示例内容。
<div id="myDiv">
<h1><!-- InstanceBeginEditable name="PageHeading" -->
The Heading<!-- InstanceEndEditable --></h1>
<!-- InstanceBeginEditable name="PageContent" -->
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nibh turpis,
sagittis vitae convallis at, fringilla nec augue.</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Sed nibh turpis, sagittis vitae convallis at, fringilla nec augue.</p>
<!-- InstanceEndEditable -->
</div><!-- END #myDiv-->
Dreamweaver模板基于HTML注释,并带有表示其用途的特定字符串。 对我来说,关键的是如下,因为它们表示页面中可编辑区域的开始和结束。
<!-- InstanceBeginEditable name="xxxxxx" -->
<!-- InstanceEndEditable -->
从我的示例HTML中可以看出,源代码中可能还有其他注释。
所以从简单开始,我有以下内容,它匹配所有可打开的可编辑区域标记。
<!-- InstanceBeginEditable(.*)?-->
接下来我想要在那里和下一个之间得到一切“
<!-- InstanceBeginEditable(.*)?-->(?<content>(.*)?)<!-- InstanceEnd
你能告诉我为什么会这样吗?我会想到一个非贪婪的捕获(。*)?在我已经工作的代码和文字
之间<!—InstanceEnd
会匹配我需要的......
答案 0 :(得分:1)
您不想在.*
附近加上括号。
这意味着贪婪地抓住所有东西。
(.*)?
这意味着懒洋洋地抓住所有东西:
.*?
此外,在正则表达式中,结尾标记中只有一个-
。将其更改为:
<!-- InstanceBeginEditable.*?-->(?<content>.*?)<!-- InstanceEnd
顺便说一句,在没有原子组的正则表达式中有两个.*
s是危险的。在意外数据上,您可以获得catastrophic backtracking。我建议将第一个.*?
更改为[^-]*
。而且,虽然我在这,但我建议你更宽容地处理空白:
<!--\s*InstanceBeginEditable[^-]*-->(?<content>.*?)<!--\s*InstanceEnd
您可能已经知道这一点,但是让我在.NET中添加它,您需要使用RegexOptions.Singleline。
答案 1 :(得分:0)
使用HTML Agility Pack,请参阅我的答案How do I parse HTML using regular expressions in C#?