martes, 27 de julio de 2010

ASP.NET - Convertir texto a hyperlink

text_to_hyperlink Cómo buscamos urls en un párrafo? cómo convertimos las direcciones ingresadas como texto simple a url?
Si lo pensamos, no es tan difícil realmente, pero bueno, tampoco hay que reinventar la rueda… buscando en google encontré (aquí http://weblogs.asp.net/farazshahkhan/) una expresión regular que detecta una url... la modifiqué un poco para que elimine caracteres al final de la url que probablemente no tengan que ver con el enlace (coma, punto, dado que estamos en una frase)... y además para que abra el enlace en una ventana nueva.
Como siempre, vamos a crear un pequeño ejemplo para testear su capacidad. Este sería el código aspx:
<html>
<head>
<title>Convertir texto a hyperlink</title>
<style type="text/css">
*
{
font-family: Trebuchet MS;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<asp:TextBox ID="txtInput" TextMode="MultiLine" Rows="4" Width="100%" Text="hola, este es un texto con urls para testear, como http://www.google.com, y http://es.yahoo.com. y repito http://es.yahoo.com. y también http://asp.net y además ftp ftp://somepath.com "
runat="server"></asp:TextBox>
<br />
<asp:Button ID="btnConvert" runat="server" Text="Convertir texto a hyperlink" />
<p>
<asp:Literal ID="ltConvertedText" runat="server"></asp:Literal>
</p>
</form>
</body>
</html>

Ahora, el código VB.NET:

1.- Añadan  Imports System.Text.RegularExpressions en la primera fila, y luego:

Protected Sub btnConvert_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnConvert.Click
Dim pattern As String = "(http(s)?|ftp)://([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?"

        Dim regex As Regex = New Regex(pattern, RegexOptions.IgnoreCase)
Dim matches As MatchCollection = regex.Matches(txtInput.Text)

Dim urls As New List(Of ListItem)
For i As Integer = 0 To matches.Count - 1
urls.Add(New ListItem(matches(i).Value, UrlClean(matches(i).Value)))
Next

Dim Input As New StringBuilder(txtInput.Text)
For Each url As ListItem In urls
Input.Replace(url.Text, String.Format("<a href=""{0}"" target=""_blank"">{1}</a>", url.Value, url.Text))
Next

ltConvertedText.Text = Input.ToString
End Sub

Private Function UrlClean(ByVal url As String) As String

If url.EndsWith(",") Or url.EndsWith(".") Then url = url.Remove(url.Length - 1, 1)

Return url

End Function

Espero que les sea de utilidad ;)

No hay comentarios.: