-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可能会更好。StackOverflow 上已经详细介绍了使用正则表达式解析 HTML,并且一致认为这是一个坏主意。

RegEx 匹配打开的标签,XHTML 自包含标签除外

于 2013-05-21T23:12:03.133 回答
2

正如 Abe Miessler 所说,您不应该使用正则表达式解析 HTML。
然而!如果您只想要您指定的确切字符串并且您绝对确定它不能以任何其他方式生成,那么您的正则表达式是:

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

请注意,这将查找所有事件,即使这些事件已被注释掉。

于 2013-05-21T23:38:11.083 回答
1
List<string> widgets = new List<string>();

MatchCollection matches = Regex.Matches(yourHTMLCode, "<widget:([^/][^>])*/>");
foreach (Match match in matches)
{
    foreach (Capture capture in match.Captures)
    {
        widgets.Add(capture.Value);
    }
}

资料来源: http: //www.dotnetperls.com/regex-matches

于 2013-05-21T23:40:43.373 回答