-1

正規表現を使用して、文字列として html があるとしましょう 正規表現を使用して文字列からすべてのウィジェット コントロール タグを取得するにはどうすればよいですか?

現在のアプローチ

const string widgetStartPattern = "<widget:ContentPageView";
const string widgetEndPattern = "/>";

var allOccuranceOfWidgets = CountStringOccurrences(aspx, widgetStartPattern);

while (allOccuranceOfWidgets.Count > 0)
{
    var firstIndex = allOccuranceOfWidgets[0];
    var lastIndex = aspx.IndexOf(widgetEndPattern, firstIndex + 1, System.StringComparison.OrdinalIgnoreCase);

    var widgetUserControlTag = aspx.Substring(firstIndex, lastIndex - firstIndex + 2);
    var pageId = ExtractPageIdFromWidgetTag(widgetUserControlTag);
    var pageContent = GetContentFromaDatabase(pageId);

    aspx = aspx.Replace(widgetUserControlTag, pageContent);
    allOccuranceOfWidgets = CountStringOccurrences(aspx, widgetStartPattern);
}

すべてのウィジェット コントロールの結果リスト

<widget:ContentPageView id="ContentPageView0" PageId="165" runat="server" />
<widget:ContentPageView id="ContentPageView1" PageId="166" runat="server" />
<widget:ContentPageView id="ContentPageView2" PageId="167" runat="server" />

HTML

<div class="slogan">

<widget:ContentPageView id="ContentPageView0" PageId="165" runat="server" />

      </div>
      <div class="headertopright">
         <div class="headersocial">

<widget:ContentPageView id="ContentPageView1" PageId="166" runat="server" />
        </div>
        <div class="searchbox">
<widget:ContentPageView id="ContentPageView2" PageId="167" runat="server" />
4

3 に答える 3

2

おそらく、HTMLAgilityPackを使用するか、XML に変換して xPath を使用してこれを行う方がよいでしょう。正規表現を使用して HTML を解析することについては、StackOverflow で詳細に説明されており、それは悪い考えであるというコンセンサスがあります。

正規表現は、XHTML 自己完結型タグを除く開始タグに一致します

于 2013-05-21T23:12:03.133 に答える
2

Abe Miessler が言ったように、HTML を正規表現で解析するべきではありません。
でも!指定した正確な文字列のみが必要で、他の方法では生成できないと確信している場合、正規表現は次のとおりです。

<widget:ContentPageView id="(?:[^"]+)" PageId="(?:[^"]+)" runat="server" />

コメントアウトされている場合でも、これによりすべての出現箇所が検索されることに注意してください。

于 2013-05-21T23:38:11.083 に答える