0

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

私が必要とするものと一致しただろう...

4

2 に答える 2

1

かっこを入れたくありません.*

これは、貪欲にすべてをつかむかどうかを意味します。

(.*)?

これは、すべてを遅延して取得することを意味します。

.*?

また、正規表現で-は、終了トークンに 1 つしかありません。これを次のように変更します。

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

ところで、.*アトミック グループのない正規表現に 2 つの があるのは危険です。予期しないデータでは、壊滅的なバックトラッキングが発生する可能性があります。.*?最初のを に変更することをお勧めし[^-]*ます。そして、私がそれに取り組んでいる間、空白をもっと寛容に扱うことをお勧めします:

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

ご存知かもしれませんが、.NET では RegexOptions.Singleline を使用する必要があることを付け加えさせてください。

于 2009-10-20T16:46:07.330 に答える
0

HTML Agility Pack を使用してください。こちらの回答を参照してください。C# で正規表現を使用して HTML を解析するにはどうすればよいですか?

于 2009-10-20T16:44:56.257 に答える