2

我有这个示例字符串:

var content = "Lorem ipsum dolor sit amet <a href=\"mailto:info@xxx.com\">info@xxx.com</a> ipsum dolor <a href=\"mailto:info@yyy.eu\">info@yyy.eu</a> adipiscing elit.";

当字符串包含邮件链接时,我想替换(操作)所有出现的 a-tag。

锚点在操作后应该看起来像:

<a href="#" title="protected">in..@xxx.com</a>

内容字符串可以包含任意数量的邮件链接。

我怎样才能最好地完成这项任务?

4

2 回答 2

2

如果你有 XHTML,那么就像 Chuck 展示的那样使用 XElement。

如果没有,那么正则表达式就是要走的路。就像是:

Regex find = new Regex("<a\\b[^>]*href=['\"]mailto:(.*?)['\"]", RegexOptions.Singleline | RegexOptions.IgnoreCase);

警告,我没有测试上面的代码,但我 99% 确定它是正确的。此外,我可能错过了电子邮件地址中的 > 等特殊情况。

于 2012-07-01T15:06:57.810 回答
0

将内容转换为 XML,然后简单地搜索a包含hrefmailto:

你需要这个来使用 XPath:using System.Xml.XPath;

var content = "Lorem ipsum dolor sit amet <a href=\"mailto:info@xxx.com\">info@xxx.com</a> ipsum dolor <a href=\"mailto:info@yyy.eu\">info@yyy.eu</a> adipiscing elit.";

XElement x = XElement.Parse(string.Format("<root>{0}</root>", content));
var hrefs = x.XPathSelectElements("a[starts-with(@href, 'mailto:')]");
foreach (XElement href in hrefs)
{
    href.Attribute("href").Value = "#";
    href.Add(new XAttribute("title", "protected"));

    string email = href.Value;
    int at = email.IndexOf('@');
    if(at > 0)
    {
        string username = email.Substring(0, at);
        string domain = email.Substring(at);
        if (username.Length > 2)
            href.Value = string.Format("{0}..{1}", 
                username.Substring(0, 2), domain);
    }
}
string result = string.Concat(x.Nodes().ToArray());
于 2012-07-01T13:25:50.220 回答