Разбор шаблонов Dreamweaver с помощью регулярных выражений

У меня есть требование разбирать содержимое шаблонов 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 ответа

Решение

Вы не хотите ставить круглые скобки .*,

Это значит жадно все схватить или нет.

(.*)?

Это значит лениво все схватить

.*?

Кроме того, в вашем регулярном выражении, у вас есть только один - в финальном жетоне. Измените это на это:

<!-- InstanceBeginEditable.*?-->(?<content>.*?)<!-- InstanceEnd

Кстати, опасно иметь два .*в регулярном выражении без атомной группы. По неожиданным данным, вы можете получить катастрофический откат назад. Я бы рекомендовал изменить первый .*? в [^-]*, И, пока я в этом, я бы посоветовал вам прощать пустые места:

<!--\s*InstanceBeginEditable[^-]*-->(?<content>.*?)<!--\s*InstanceEnd

Вы, наверное, уже знаете это, но позвольте мне добавить, что с.NET вам нужно будет использовать RegexOptions.Singleline.

Используйте HTML Agility Pack, см. Мой ответ здесь. Как мне разобрать HTML, используя регулярные выражения в C#?

Другие вопросы по тегам