将正则表达式转换为htmlagilitypack

时间:2012-12-14 00:06:15

标签: c# regex html-agility-pack

我有以下html元素:

<div class="wrapper">
     <span class="wrapper2">
          <div class="myClass">
           MyString   
           </div>
           <button>buttonText</button>
     </span>
</div>   

So, I need to convert that element to be   

≤MyString≥ free text <br> <i> <u>..... ≤MyString≥

所以,我想出了如何从html转换为我的特殊字符,但无法弄清楚如何在htmlAgilityPack和XPath中向后转换为html。我能够纯粹在正则表达式中完成它,但它不是最好的解决方案。

从html到specialchars:

   private  string transformFromHtmlToMergeCodes(string text)
            {
                var doc = new HtmlDocument();
                doc.LoadHtml(text);
                var nodes = doc.DocumentNode.SelectNodes("//div[@class='wrapper']");
                foreach (var item in nodes)
                {
                    var innerText = "≤" + item.SelectSingleNode("//div[@class='myClass']").InnerText + "≥";
                    var textNode = HtmlNode.CreateNode(innerText);
                    item.ParentNode.ReplaceChild(textNode,item);
                }
                return doc.DocumentNode.InnerHtml;

            }

从特殊字符到html:

 private  string transformFromMergeCodesToHtml(string text)
        {
            var matches  = Regex.Matches(text, @"\«(.*?)\»");
            foreach (Match match in matches)
            {
                var innerText = match.Value
                                     .Replace("≤", @"<div class=""wrapper"" contenteditable=""false"">
                                                    <span class=""wrapper2"">
                                                    <div class=""myClass"">").Replace("≥",@"</div><button type="" button"" class=""MergeCodeRemoveIcon"">×</button></span></div>");
                text = text.Replace(match.Value, innerText);
            }
            return text;
        }

所以,这是我想要修改以使用htmlAgilityPack的第二个函数,因为这不是最有效的方法,特别是如果我有重复的节点。
我试图找到≤MyString≥并将其转换为节点,但HtmlAgilityPack会抛出一个错误,它不是一个有效的节点(这是有道理的。)有什么建议吗?
修改
要清楚。这是我想要执行的转换:
之前:

<div class="wrapper">
     <span class="wrapper2">
          <div class="myClass">
           MyString   
           </div>
           <button>buttonText</button>
     </span>
</div>  
free text <br> <i> <u>.....   
<div class="wrapper">
     <span class="wrapper2">
          <div class="myClass">
           MyString2   
           </div>
           <button>buttonText</button>
     </span>
</div>    

之后:

`≤MyString≥ free text <br> <i> <u>..... ≤MyString2≥`

和副Versa

1 个答案:

答案 0 :(得分:3)

如果我理解正确,这可能会成功。如果没有,请在预期文本之前,之间,之后显示清楚。

        var nodes = doc.DocumentNode.Descendants("#text").Where(text => Regex.IsMatch(text.InnerText.Trim(), @"≤[^≥]*≥"));
        string format =
            @"<div class=""wrapper"" contenteditable=""false""><span class=""wrapper2""><div class=""myClass"">{0}</div><button type="" button"" class=""MergeCodeRemoveIcon"">×</button></span></div>";

        foreach (var htmlNode in nodes)
        {
            htmlNode.InnerHtml = string.Format(CultureInfo.InvariantCulture, format, htmlNode.InnerText.Trim().Trim(new[] { '≤', '≥' }));
        }

        return doc.DocumentNode.OuterHtml;

试试这个:

    private static string transformFromMergeCodesToHtml(string textWithMergeCodes)
    {
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(textWithMergeCodes);

        var nodes = doc.DocumentNode.Descendants("#text").Where(text => Regex.IsMatch(text.InnerText.Trim(), @"≤[^≥]*≥"));
        string format =
            @"<div class=""wrapper"" contenteditable=""false""><span class=""wrapper2""><div class=""myClass"">$2</div><button type="" button"" class=""MergeCodeRemoveIcon"">×</button></span></div>";

        foreach (var htmlNode in nodes)
        {
            htmlNode.InnerHtml = Regex.Replace(htmlNode.InnerText.Trim(), @"(≤)([^≥]*)(≥)", format);
        }
        return doc.DocumentNode.OuterHtml;
    }

    private static string transformFromHtmlToMergeCodes(string text)
    {
        var doc = new HtmlDocument();
        doc.LoadHtml(text);
        var nodes = doc.DocumentNode.SelectNodes("//div[@class='wrapper']");
        foreach (var item in nodes)
        {
            var innerText = "≤" + item.SelectSingleNode("//div[@class='myClass']").InnerText.Trim() + "≥";
            var textNode = HtmlNode.CreateNode(innerText);
            item.ParentNode.ReplaceChild(textNode, item);
        }
        return doc.DocumentNode.InnerHtml;

    }

注意:我也更新了其他方法!

相关问题