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.";

文字列に mailto-link が含まれている場合、a-tag のすべての出現箇所を置換 (操作) したいと考えています。

操作後のアンカーは次のようになります。

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

コンテンツ文字列には、任意の数の mailto-link を含めることができます。

このタスクを最適に実行するにはどうすればよいですか?

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 に答える