c# - 将正则表达式转换为 htmlagilitypack

标签 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 到特殊字符:

   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≥`

反之亦然

最佳答案

如果我理解正确的话,这可能会起作用。如果没有,请在预期文本的前面、中间和后面清楚地显示出应该是什么样子。

        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;

    }

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

关于c# - 将正则表达式转换为 htmlagilitypack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13870751/

相关文章:

具有模式和匹配器的 Java 正则表达式

正则表达式匹配两个连续的 h2 markdown 标题?

C# 编码 Shift-JIS 与 utf8 html 敏捷包

c# - 将现有 MVC4 项目移动到 Visual Studio Online

javascript - 使用 Response.Write JSON 输出从 Jquery 调用 c# asmx Web 服务

javascript - 如何根据选择的选项值验证表单输入字段?

c# - 如何使用 HTML Agility Pack 将输入标签添加到表单?

c# - 使用 htmlagility pack 抓取表数据

c# - ABCpdf 只渲染第一页

c# - 将 SAXON 9.5 (nuget) 与 Schematron 结合使用