簡體   English   中英

從中提取內容 <div class=“ ”></div> 標簽C#RegEx

[英]Extract Content from <div class=“ ”> </div> Tag C# RegEx

我有一個代碼。

string tag = "div";
string pattern = string.Format(@"\<{0}.*?\>(?<tegData>.+?)\<\/{0}\>", tag.Trim());
Regex regex = new Regex(pattern, RegexOptions.ExplicitCapture);
MatchCollection matches = regex.Matches(data);

`

我需要在<div class="in"> .... </div>標記之間獲取內容

   <div class="in">
        <a href="/a/show/7184569" class="mm">ВАЗ 2121</a> <span class="for">за</span>    <span class="price">2 700 $</span></span><br/><span class="year">1990 г.</span><br/><div style="margin: 3px 0 3px 0">1.6 л, бензин, КПП механика, с пробегом, белый, литые диски, тонировка, спойлер, ветровики, противотуманки, Движок после капитального ремонта!</div><div>
     <span style="display:block; padding: 4px 0 0 0;"><span class="region">Костанай</span><span class="adv-phones">, +7 (777) 4464451</span></span>

            <small class="gray air">24 просмотра</small>


            <small class="gray air">13 июня</small>
    </div>
    <div class="selectItem" title="Выбрать" id="fv_sic_7184569">
        <a href="#" class="fav-button" id="fav_7184569">&nbsp;</a>           </div>
</div>

我該怎么做? 我的代碼不起作用。

這是一個可提取簡單div標簽的正則表達式:

// <div[^>]*>(.+?)</div>

string tag = "div";
string pattern = string.Format(@"<{0}[^>]*>(?<tegData>.+?)</{0}>", tag.Trim());

但是,使用RegEx進行HTML解析幾乎總是不合適的,並且保證不能正常工作。 這僅僅是因為諸如HTML之類的標記語言不是常規語言。

話雖這么說,您最好使用XML解析器來解析文檔或片段,然后提取所需的內容。 實際上,使用僅轉發解析器甚至可能比嘗試使用RegEx更快。

您應該查看.NET中的XmlReader類

如果不必是服務器端,則可以使用一些JavaScript來實現。 如:

 <script language="javascript">
     function getData(){
          var divs = document.getElementByTagName('div');
          var data;
          var x;
          for(x = 0; x < divs.length; x++)
          {
            if(divs[x].className == 'in') 
            {
                data = divs[x].innerHTML;
            }
          }
     }
 </script>

要獲取嵌套標簽,請嘗試使用以下功能:

public static MatchCollection ParseTag(string str, string tagpat, string argpat, string valpat) {
    if (null == tagpat) argpat = @"\w+";
    if (null == argpat) argpat = @"[^>]*";
    if (null == valpat) valpat = @"(?><\k'tag'\b[^>]*>(?'nst')|</\k'tag'>(?'-nst')|.?)*?(?(nst)(?!))";
    return Regex.Matches(str, @"(?><(?'tag'" + tagpat + @"\b)\s*(?'arg'" + argpat + @")>)(?'val'" + valpat + @")</\k'tag'>",
        RegexOptions.IgnoreCase | RegexOptions.Singleline);
}

參數是用於過濾目標標記的簡單正則表達式,下面是示例:

ParseTag(page, "div", @"id=""content""\s+class=""mw-body""", null);
ParseTag(wikipage, "span", @"class=""bday""", @"\d{4}-\d{2}-\d{2}");

此變體處理打開和關閉標簽以及相同類型的嵌套標簽(其他嵌套標簽可以被破壞和忽略)。

另一個變體會更嚴格地檢查嵌套標簽,如果其中一些打開錯誤或關閉錯誤,則不匹配:

if (null == valpat) valpat = @"(?><(?'itag'\w+)\b[^>]*>(?'nst')|</\k'itag'>(?'-nst')|.?)*?(?(nst)(?!))";

對我來說,使用XPath更容易。 也許您會發現它很有用。

textBox2.Text = "<div style=\"padding: 5px; width: 212px\"><div>more text</div></div>";
string x = "//div[contains(@style,'padding: 5px; width: 212px;')]";
XmlDocument doc = new XmlDocument();
doc.LoadXml(textBox2.Text);

XmlNodeList nodes = doc.SelectNodes(textBox1.Text);
foreach(XmlNode node in nodes)
{
    textBox3.Text = node.InnerXml;
}

適用於RegEx的代碼將找到第一個內部div。

string r = @"<div style=""padding: 5px; width: 212px;";
Regex rg = new Regex(r);

var matches = rg.Matches(s);
if (matches.Count > 0)
{
foreach (Match m in matches)
{
textBox3.Text += m.Groups[1];
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM