2012-03-20 51 views
0

我有一個大的字符串,它可能有以下幾點:匹配和使用替換文本字符串正則表達式

<div id="Specs" class="plinks"> 
<div id="Specs" class="plinks2"> 
<div id="Specs" class="sdfsf"> 
<div id="Specs" class="ANY-OTHER_NAME"> 

我怎麼能替換值的字符串中的任何東西上面:

<div id="Specs" class=""> 

這是我想出了,但它不工作:

 string source = "bunch of text"; 
     string regex = "<div id=\"Specs\" class=[\"']([^\"']*)[\"']>"; 
     string regexReplaceTo = "<div id=\"Specs\" class=\"\">"; 
     string output = Regex.Replace(source, regex, regexReplaceTo); 
+0

有趣的是,它的工作! :\我使用不正確的源字符串來做到這一點!不知道!謝謝大家的幫助! – Andrew 2012-03-20 14:25:26

回答

2

使用HTML Agility Pack解析HTML並操作內容。使用HTML Agility PAck,結合Linq或Xpath,您的屬性順序不再重要(當您使用Regex時,它的作用),並且解決方案的整體穩定性增加很多。

使用HTML敏捷性包(project pagenuget),這樣做的伎倆:

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml("your html here"); 
// or doc.Load(stream); 

var nodes = doc.DocumentNode.DescendantNodes("div").Where(div => div.Id == "Specs"); 

foreach (var node in nodes) 
{ 
    var classAttribute = node.Attributes["class"]; 
    if (classAttribute != null) 
    { 
     classAttribute.Value = string.Empty; 
    } 
} 

var fixedText = doc.DocumentNode.OuterHtml; 
//doc.Save(/* stream */); 
4

怎樣......

  • 正則表達式匹配:class=\"[A-Za-z0-9_\-]+\"
  • 替換:class=\"\"

通過這種方式,我們忽略了第一部分(id="Specs"等), 只需更換類的名字......什麼也沒有。

+0

但是,如果他只想清除#specs div的類屬性呢?我(我可能是錯的)假定他呢? – Robbie 2012-03-20 02:15:07

+0

好吧,如果是這樣的話,你可以添加最前面的部分,我想...就像:'\ id = \「Specs \」class = \「[A-Za-z0-9 _ \ - ] + \「' – 2012-03-20 02:19:38

+0

+1似乎工作 – Robbie 2012-03-20 02:24:11

4

看起來像另一個案例http://www.codinghorror.com/blog/2008/06/regular-expressions-now-you-have-two-problems.htmlRegex以下有效標籤會發生什麼變化?

<div class="reversed" id="Specs">    
<div id="Specs" class="additionalSpaces" >  
<div id="Specs" class="additionalAttributes" style="" > 

我沒有看到如何使用Linq2Xml不會與任何組合的工作:如果您輸入不符合XML規範,其中大部分HTML不是,那麼你就可以

XElement root = XElement.Parse(xml); // XDocument.Load(xmlFile).Root 
var specsDivs = root.Descendants() 
        .Where(e => e.Name == "div" 
          && e.Attributes.Any(a => a.Name == "id") 
          && e.Attributes.First(a => a.Name == "id").Value == "Specs" 
          && e.Attributes.Any(a => a.Name == "class")); 
foreach(var div in specsDivs) 
{ 
    div.Attributes.First(a => a.Name == "class").value = string.Empty; 
} 
string newXml = root.ToString()  
相關問題