webForumDet fria alternativet

Text till länkar.

.NET

5 svar · 683 visningar · startad av saw

Medlem sedan mars 20011 880 inlägg
Frågan#1

Jag har hittat ett litet trevligt script som letar upp www-adresser till länkar.

public  string ActivateLinks(object Text)
        {
        string result = (string)Text;
        string patten = @"([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";
        Regex chr = new Regex(patten, RegexOptions.IgnoreCase);
        Match m;
        for (m = chr.Match(result); m.Success; m = m.NextMatch())
            {
            result = result.Replace(m.Groups[0].ToString(),
                "<a href=\"HTTP://" + m.Groups[0].ToString() + "\" target='_blank'>" + m.Groups[0].ToString() + "</a>");
            }
        return result;
        }

Detta fungerar kanonbra, men hur gör jag för att bygga om denna så att den
även kan hitta mail-adress??? :i

Medlem sedan jan. 2007152 inlägg
#2

Du får modifiera ditt pattern att hitta mailadresser också. Sedan lägger du till en if-sats i din for-slinga där du letar efter @ i m-variabeln. Om sant lägger du till mailto, annars http. Detta borde funka. :)

    public string ActivateLinks(object Text)
    {
        string result = (string)Text;
        string patten = @"(\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)|([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";
        Regex chr = new Regex(patten, RegexOptions.IgnoreCase);
        Match m;
        for (m = chr.Match(result); m.Success; m = m.NextMatch())
        {
            if(m.ToString().Contains("@"))
                result = result.Replace(m.Groups[0].ToString(),
                   "<a href=\"mailto:" + m.Groups[0].ToString() + "\">" + m.Groups[0].ToString() + "</a>");
            else 
               result = result.Replace(m.Groups[0].ToString(),
                    "<a href=\"http://" + m.Groups[0].ToString() + "\" target='_blank'>" + m.Groups[0].ToString() + "</a>");
        }
        return result;
    }
Medlem sedan mars 20011 880 inlägg
#3

Helt sagoligt butiko tack och en god fortsättning.

Medlem sedan mars 20023 561 inlägg
#4

Eller så byter man ut den långa if-satsen mot den lite kortare: :)

result = result.Replace(m.Groups[0].ToString(), 
     string.Format("<a href=\"{0}/{1}\" target=\"_blank\">{1}</a>",
                        m.ToString().Contains("@") ? "mailto:" : "http://", 
                        m.Groups[0].ToString());
Medlem sedan maj 200010 687 inlägg
#5

Bara för att man gör koden kortare så blir den inte bättre/mer lättläst.

Jag skulle istället skriva funktionen ungefär så här...

public static string ActivateLinks(string Text)
{
	const string pattern = @"(?<email>\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)|([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";

	return Regex.Replace(
		Text,
		pattern,
		new MatchEvaluator(delegate(Match match)
		{
			string prefix = match.Groups["email"].Length > 0 ? "mailto:" : "http://";

			return string.Format("<a href=\"{0}{1}\" target=\"_blank\">{1}</a>", prefix, match.Value);
		}),
		RegexOptions.IgnoreCase
	);
}

1. Static funktion.
2. Pattern som en konstant.
3. Kollar om gruppen "email" innehåller nåt och ser då att det är en e-postadress.
4. Använder match.Value. Istället för match.Groups[0].ToString().
5. Använder inte strings Replace metod i loopen utan använder istället Regex Replace funktionen med en MatchEvaluator.

Medlem sedan jan. 20022 440 inlägg
#6

Jag gjorde om den till en extension method. Nu behöver jag bara köra

string.ActivateLinks();

Tack för den Erik! :)

Det enda som måste göras för att göra om den till en extension på string är att lägga den i en statisk verktygsklass och lägga till

public static string ActivateLinks([b]this[/b] string text)
264 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)