【问题标题】:c# remove specific <a> tags (e-mail only) in a stringc# 删除字符串中的特定 <a> 标记(仅限电子邮件)
【发布时间】:2016-12-15 16:47:37
【问题描述】:

所以我从外部方法得到这样的字符串:

var myString = "<p>Lorem &sect; 5 ipsum</p>\r\n<p><p>E-Mail: <a href=\"email@domain.com\">email@domain.com</a></p>\r\n<p>Lorem ipsum dolor sit amet</p><p><a href=\"http://www.adress.com\">name</a></p>\r\n";

我想用纯文本替换所有电子邮件地址(没有其他链接)。所以之后我的链接应该是这样的:

var myClearedString = "<p>Lorem &sect; 5 ipsum</p>\r\n<p><p>E-Mail: email@domain.com</p>\r\n<p>Lorem ipsum dolor sit amet</p><p><a href=\"http://www.adress.com\">name</a></p>\r\n"

字符串中可能有 1 到 n 次出现。我已经搜索过stackoverflow,但唯一相关的是这个问题:Replace mailto-links

在我看来,将字符串转换为 XML 并进行搜索是最好的方法。不幸的是,我的字符串中的某些字符似乎造成了麻烦(我假设它可能是 \n 或 \r)。

【问题讨论】:

  • 通常,对于电子邮件,地址前面有一个mailto: 协议。
  • 不幸的是在这种情况下没有

标签: c# .net model-view-controller


【解决方案1】:

您应该为此查看Html AgilityPack。我敢肯定,有许多正则表达式可以帮助您完成大部分工作,但使用 Regex 解析 HTML 通常是个坏主意。出于某些原因,请参阅https://stackoverflow.com/a/1732454/880642

Agility Pack 将为您安全地解析文档,并让您遍历它以找到符合您条件的链接。

var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(htmlPage);
var links = htmlDocument.DocumentNode.SelectNodes("//a[@href]");
foreach (var node in links)
{
    HtmlAttribute attribute = node.Attributes["href"];
    if(IsEmail(attribute.Value))
         node.ParentNode.RemoveChild(node, true); //<-- keepGrandChildren
}
var newhtml = htmlDocument.DocumentNode.OuterHtml;

您可能可以使用正则表达式来验证属性值是否为电子邮件或任意数量的 .Net 函数来查看字符串是否为电子邮件。我很惊讶这些不是mailto: 链接,但您必须使用您拥有的数据。

【讨论】:

  • 就是这样,谢谢...我不得不稍微修改一下,也许您可​​以更新您的答案,以便其他用户找到正确的解决方案。我所做的是验证属性是否包含@,然后用纯文本创建一个新节点并替换当前节点: if (attribute.Value.Contains("@")) { var newNode = HtmlNode.CreateNode(attribute.价值); node.ParentNode.ReplaceChild(newNode, node); }
【解决方案2】:

我可能会因为提出这个建议而被挂,但你可以使用正则表达式。

从包含必要的依赖开始:

using System.Text.RegularExpressions;

然后我们需要找出将识别与您的条件匹配的子字符串的正则表达式。有几个站点提供正则表达式测试。只需搜索“正则表达式测试器”即可。

这将获取每个锚标记,并创建 3 个组:

(<a[^>]+>)(.*?)(<\/a>)

现在我们需要获取所有匹配项并将它们替换为纯文本值。

我们可以使用Regex.Replace方法来完成任务:

string newValue = Regex.Replace(test, @"(<a[^>]+>)(.*?)(<\/a>)", (m) => 
{
    return m.Groups[2].Value;
});

这个 sn-p 正在为每个匹配的实例运行 lambda 表达式。然后返回第二组的值(标签的内容)。

【讨论】:

  • OP 可能只想找到包含 @ 的链接,因为他只想删除电子邮件链接。
【解决方案3】:

这将是 Regex 和 Replace 的一个很好的用途

Regex.Replace(myString, @"(<a.*?>)", "").Replace("</a>","")

【讨论】:

    【解决方案4】:

    你可以使用:

    Regex.Replace(source, "<a.*?>", string.Empty);
    

    或者如果你想替换更多次你可以使用编译的正则表达式:

    Regex removeRegex = new Regex("<a.*?>", RegexOptions.Compiled);
    

    并按如下方式使用它:

    removeRegex.Replace(source, string.Empty);
    

    【讨论】:

    • 你还需要去掉结束标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2023-03-25
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多