使用正则表达式解析Dreamweaver模板

时间:2009-10-20 15:36:33

标签: c# regex templates dreamweaver dreamweaver-templates

我需要从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

会匹配我需要的......

2 个答案:

答案 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#?