【问题标题】:Replacement matching regex with anchor tag?用锚标签替换匹配的正则表达式?
【发布时间】:2016-03-31 20:09:32
【问题描述】:

我在使用正则表达式时遇到问题。我有一个 html 文档,当它匹配条件时会创建一个锚链接。

一个示例html:

Căn cứ Luật Tổ chức HĐND và UBND ngày 26/11/2003;

Căn cứ Nghị định số 63/2010/NĐ-CP ngày 08/6/2010 của Chính phủ về kiểm soát thủ tục hành chính;

Căn cứ Quyết định số 165/2011/QĐ-UBND ngày 06/5/2011 của UBND tỉnh ban hành Quy định kiểm soát thủ tục hành chính trên địa bàn tỉnh;

Căn cứ Quyết định số 278/2011/QĐ-UBND ngày 02/8/2011 của UBND tỉnh ban hành Quy chế phối hợp thực hiện thống kê, công bố, công khai thủ tục hành chính và tiếp nhận, xử lý phản ánh, kiến nghị của cá nhân, tổ chức về quy định hành chính trên địa bàn tỉnh;

Xét đề nghị của Giám đốc Sở Công Thương tại Tờ trình số 304/TTr-SCT ngày 29 tháng 5 năm 2013

我想匹配这些粗体文本并从中制作锚链接。如果有,请尝试忽略。链接示例<a href="/tags?query=63/2010/NĐ-CP">63/2010/NĐ-CP</a>

var matchLegals = new Regex(@"(?:[\d]+\/?)\d+\/[a-z\dA-Z_ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼỀỀỂưăạảấầẩẫậắằẳẵặẹẻẽềềểỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹ\-]+", RegexOptions.Compiled);

            var doc = new HtmlDocument();
            doc.LoadHtml(htmlString);

                var allElements = doc.DocumentNode.SelectSingleNode("//div[@class='main-content']").Descendants();
            foreach (var node in allElements)
            {
                var matches = matchLegals.Matches(node.InnerHtml);

                foreach (Match m in matches)
                {
                    var k = m.Value;
                   //dont know what to do
                }

            }

我能做什么 非常感谢。

【问题讨论】:

    标签: regex html c#-4.0 html-agility-pack


    【解决方案1】:

    @Shaamaan 感谢您的建议。经过几个小时的编码,它现在可以工作了

    var content =    doc.DocumentNode.SelectSingleNode("//div[@class='main-content']");
    var items = content.SelectNodes(".//text()[normalize-space(.) != '']");
    foreach (HtmlNode node in items)
     {
           if (!matchLegals.IsMatch(node.InnerText) || node.ParentNode.Name == "a")
    {
                                   continue;
     }
    
      var texts = node.InnerHtml.Trim();
      node.InnerHtml = matchLegals.Replace(texts, a => string.Format("<a href='/search?q={0}'>{0}</a>",a.Value));
    
     }
    

    【讨论】:

      【解决方案2】:

      你匹配文本并替换:

      <script>
      
          var s = '...';
          var matchs = s.match(/\d{2,3}\/\d{4}\/[a-zA-Z\-áàảãạăâắằấầặẵẫậéèẻẽẹêếềểễệóòỏõọôốồổỗộơớờởỡợíìỉĩịđùúủũụưứửữựÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠƯĂẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼÊỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỨỪỬỮỰỲỴÝỶỸửữựỵỷỹ]+/gi);
          if (matchs != null) {
              for(var i=0; i<matchs.length;i++){
                  var val = matchs[i];
                  s = s.replace(val, '<a href="?key=' + val + '"/>' + val + '</a>');
              }
          }
          document.write(s);
      
      </script>
      

      【讨论】:

        【解决方案3】:

        我假设您的正则表达式模式正常并且有效。另一个假设是 node.InnerHtml 不包含任何已包含任何潜在匹配项的 &lt;a&gt; 标记。

        在这种情况下,就像这样简单:

        node.InnerHtml = Regex.Replace(node.InnerHtml, "[your pattern here]", "<a href='query=$&'>$&</a>");
        
        ...
        
        doc.Save("output.html");
        

        请注意,您可能需要处理 href 组件 - 我不确定应该如何构建您的链接。

        【讨论】:

        • 第一次运行时一切正常。它会导致嵌套锚元素 sample regex 出错,我对此一无所知
        • @tuan.it89 听起来您正在为同一段多次运行代码。尝试一步一步的调试器,并确保Regex.Replace 在每个 HTML 段中执行的次数不超过一次。此外,代码假定您的 HTML 中的匹配项周围没有 标记!
        • 用户需要多次更新文章内容,所以会重新匹配内容。我需要找到一种方法来正则表达式新匹配并忽略存在。
        • @tuan.it89 在这种情况下,这是一个不同的问题。您询问如何添加 &lt;a&gt; 标签,而我的回答提供了该信息。现在您需要使用 HtmlAgility 来遍历各种 HTML 节点,并且只处理那些纯文本(没有内部 HTML 代码)的节点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2012-05-16
        • 2013-11-27
        • 2015-11-30
        • 1970-01-01
        • 1970-01-01
        • 2013-12-06
        相关资源
        最近更新 更多