2012-03-20 56 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()