2010-05-26 4 views
1

J'ai un corps de courriel qui était auparavant du texte brut, mais maintenant je l'ai fait HTML. Les courriels sont générés en utilisant un certain nombre de méthodes et aucune d'elles n'est facile à convertir.Remplacer les courriels et HREFS avec HREFS englobant

Ce que j'est:

Some content [email protected], some http://www.somewebsite/someurl.aspx. 

Ce que je voudrais faire est de créer une fonction qui enferme automatiquement toutes les adresses e-mail et toutes les URL dans une chaîne dans les balises HREF de sorte que le lit e-mail HTML correctement dans tous les clients de messagerie.

Quelqu'un at-il une fonction pour cela?

Répondre

2

Nous avons besoin ici d'une magie d'expression régulière. D'abord nous trouvons les emails. J'espère que nous n'avons pas besoin de les valider, donc tout mot sans espaces avec @ suivi par. c'est ok.

public static string MakeEmailsClickable(string input){ 
    if (string.IsNullOrEmpty(input)) return input; 
    Regex emailFinder = new Regex(@"[^\s][email protected][^\s\.]+.[^\s]+", RegexOptions.IgnoreCase); 
    return emailFinder.Replace(input, "<a href=\"mailto:$&\">$&</a>"); 
} 

$& - représente le match en cours dans regex.

Pour trouver Urls, nous supposons qu'ils commencent par un nom de protocole suivi de ://, là encore aucun espace n'est autorisé.

public static string MakeUrlsClickable(string input){ 
    if (string.IsNullOrEmpty(input)) return input; 
    Regex urlFinder = new Regex(@"(ftp|http(s)?)://[^\s]*", RegexOptions.IgnoreCase); 
    return urlFinder.Replace(input, "<a href=\"$&\">$&</a>"); 
} 

Celui-ci semble pour ftp, http ou https liens, mais vous pouvez ajouter tout protocole en regex séparant avec | (pipe) comme ça: (file|telnet|ftp|http(s)?)://[^\s]*).

En fait, l'URL peut également contenir @http://username:[email protected]:port/, mais j'espère que ce n'est pas le cas, car nous devrons alors utiliser des expressions régulières plus strictes.

1

Vous dites que vous voulez inclure tous les courriels et les URL contenus dans une chaîne - vous voulez dire? Si oui, alors quelque chose comme ça va faire l'affaire. Il reconnaît les e-mails et les URL. Parce que nous supposons que la chaîne définit la longueur de l'adresse email/url, alors les expressions rationnelles sont délibérément laxistes - essayer d'être trop spécifique ici peut signifier que certains cas légitimes ne sont pas appariés.

public string LinkQuotedEmailsAndURLs(string email) 
{ 
    Regex toMatch = new Regex("((https?|ftp)?://([\\w+?\\.\\w+])+[^ \"]*)|\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*", RegexOptions.IgnoreCase); 

    MatchCollection mactches = toMatch.Matches(email); 

    foreach (Match match in mactches) { 
     email = email.Replace(match.Value, "<a href=" + match.Value + ">" + match.Value.Substring(1,match.Value.Length-2) + "</a>"); 
    } 

    return email; 
} 

On ne sait pas si le texte original contient les URL réelles de code URL ou formes décodées url- « présentable ». Vous pouvez utiliser HttpUtils.UrlEncode/UrlDecode sur la valeur de correspondance pour vous assurer que le href incorporé est codé, alors que la chaîne présentée est décodée, ainsi le href inclut "% 20" mais ceux-ci sont affichés comme des caractères normaux dans le texte du lien.

E.g. Si le texte déjà présent est l'URL réelle, alors vous pouvez utiliser

email = email.Replace(match.Value, "<a href=" + match.Value + ">" + 
     HttpUtils.UrlEncode(match.Value.Substring(1,match.Value.Length-2)) + "</a>"); 
Questions connexes