Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Juancho25 en 7 Junio 2013, 08:01 am



Título: ¿Cómo encontrar una cadena dentro de un párrafo de texto?
Publicado por: Juancho25 en 7 Junio 2013, 08:01 am
Hola, me gustaría saber qué hacer para encontrar una cadena de texto dentro de un párrafo de texto más extenso en Windows Forms, por ejemplo, yo ingreso lo siguiente en un textBox:

<a href="http://1.bp.blogspot.com/-NhL7eyZF_bM/UC6AO7LanyI/AAAAAAAADNw/VkfXa-fNxpA/s1600/glucides-vitamines-fruits.jpg"/> <a href="http://1.bp.blogspot.com/-NhL7eyZF_bM/UC6AO7LanyI/AAAAAAAADNw/VkfXa-fNxpA/s1600/glucides-vitamines-fruits11.jpg"/>


y lo que me gustaría encontrar para que lo mostrara en otro textBox es solamente http://1.bp.blogspot.com/-NhL7eyZF_bM/UC6AO7LanyI/AAAAAAAADNw/VkfXa-fNxpA/s1600/glucides-vitamines-fruits.jpg y http://1.bp.blogspot.com/-NhL7eyZF_bM/UC6AO7LanyI/AAAAAAAADNw/VkfXa-fNxpA/s1600/glucides-vitamines-fruits11.jpg

omitiendo <a href=" y "/> contando que podrían agregarse muchos más códigos con links en el mismo textBox. Espero haberme explicado y me puedan ayudar.


Título: Re: ¿Cómo encontrar una cadena dentro de un párrafo de texto?
Publicado por: XresH en 7 Junio 2013, 10:37 am
Qué lenguaje estás manejando?


Saludos.


Título: Re: ¿Cómo encontrar una cadena dentro de un párrafo de texto?
Publicado por: Eleкtro en 7 Junio 2013, 10:41 am
Hay varias formas.

Si estás usando un html/xml/xmlns lo mejor quizás sería que uses htmlagilitypack: http://htmlagilitypack.codeplex.com/
...Pero es el método más dificil de entre los que existen, y dependiendo del conteido (sopa de tags) podría no serte útil en absoluto.

Puedes usar el método SPLIT : http://msdn.microsoft.com/en-us/library/system.string.split.aspx

Código
  1. for each item in variable_de_tipo_String.split(controlchars.quote) : msgbox(item) : next

O mi manera favorita, Expresiones regulares: http://en.wikipedia.org/wiki/Regular_expression

Output:
Código:
http://1.bp.blogspot.com/-NhL7eyZF_bM/UC6AO7LanyI/AAAAAAAADNw/VkfXa-fNxpA/s1600/glucides-vitamines-fruits.jpg
http://1.bp.blogspot.com/-NhL7eyZF_bM/UC6AO7LanyI/AAAAAAAADNw/VkfXa-fNxpA/s1600/glucides-vitamines-fruits11.jpg

Código
  1. Public Class Form1
  2.  
  3.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  4.  
  5.        Dim str As String = <a><![CDATA[<a href="http://1.bp.blogspot.com/-NhL7eyZF_bM/UC6AO7LanyI/AAAAAAAADNw/VkfXa-fNxpA/s1600/glucides-vitamines-fruits.jpg"/> <a href="http://1.bp.blogspot.com/-NhL7eyZF_bM/UC6AO7LanyI/AAAAAAAADNw/VkfXa-fNxpA/s1600/glucides-vitamines-fruits11.jpg"/>]]></a>.Value
  6.        Dim regex As String = <a><![CDATA[(http://|https://|www)([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?]]></a>.Value
  7.  
  8.        For Each match In RegEx_Matches_To_List(str, regex) : MsgBox(match) : Next
  9.  
  10.    End Sub
  11.  
  12. #Region " RegEx Matches To List "
  13.  
  14.    ' [ RegEx Matches To List Function ]
  15.    '
  16.    ' // By Elektro H@cker
  17.  
  18.    Private Function RegEx_Matches_To_List(ByVal str As String, ByVal RegEx_Pattern As String, _
  19.                                           Optional ByVal Group As Int32 = 0, _
  20.                                           Optional ByVal IgnoreCase As Boolean = True) _
  21.                                           As List(Of String)
  22.  
  23.        Dim regex_option As System.Text.RegularExpressions.RegexOptions
  24.  
  25.        If IgnoreCase Then regex_option = System.Text.RegularExpressions.RegexOptions.IgnoreCase _
  26.        Else regex_option = System.Text.RegularExpressions.RegexOptions.None
  27.  
  28.        Dim match As System.Text.RegularExpressions.Match = System.Text.RegularExpressions.Regex.Match(str, RegEx_Pattern, regex_option)
  29.        Dim Matches_List As New List(Of String)
  30.  
  31.        Do While match.Success
  32.            Matches_List.Add(match.Groups(Group).ToString)
  33.            match = match.NextMatch()
  34.            Application.DoEvents()
  35.        Loop
  36.  
  37.        Return Matches_List
  38.  
  39.    End Function
  40.  
  41. #End Region
  42.  
  43. End Class

Saludos.


Título: Re: ¿Cómo encontrar una cadena dentro de un párrafo de texto?
Publicado por: Juancho25 en 8 Junio 2013, 08:29 am
Qué lenguaje estás manejando?


Saludos.


C++ en Windows Forms.


Título: Re: ¿Cómo encontrar una cadena dentro de un párrafo de texto?
Publicado por: Juancho25 en 8 Junio 2013, 08:33 am
Hay varias formas.

Si estás usando un html/xml/xmlns lo mejor quizás sería que uses htmlagilitypack: http://htmlagilitypack.codeplex.com/
...Pero es el método más dificil de entre los que existen, y dependiendo del conteido (sopa de tags) podría no serte útil en absoluto.

Puedes usar el método SPLIT : http://msdn.microsoft.com/en-us/library/system.string.split.aspx

Código
  1. for each item in variable_de_tipo_String.split(controlchars.quote) : msgbox(item) : next

O mi manera favorita, Expresiones regulares: http://en.wikipedia.org/wiki/Regular_expression

Output:
Código:
http://1.bp.blogspot.com/-NhL7eyZF_bM/UC6AO7LanyI/AAAAAAAADNw/VkfXa-fNxpA/s1600/glucides-vitamines-fruits.jpg
http://1.bp.blogspot.com/-NhL7eyZF_bM/UC6AO7LanyI/AAAAAAAADNw/VkfXa-fNxpA/s1600/glucides-vitamines-fruits11.jpg

Código
  1. Public Class Form1
  2.  
  3.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  4.  
  5.        Dim str As String = <a><![CDATA[<a href="http://1.bp.blogspot.com/-NhL7eyZF_bM/UC6AO7LanyI/AAAAAAAADNw/VkfXa-fNxpA/s1600/glucides-vitamines-fruits.jpg"/> <a href="http://1.bp.blogspot.com/-NhL7eyZF_bM/UC6AO7LanyI/AAAAAAAADNw/VkfXa-fNxpA/s1600/glucides-vitamines-fruits11.jpg"/>]]></a>.Value
  6.        Dim regex As String = <a><![CDATA[(http://|https://|www)([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?]]></a>.Value
  7.  
  8.        For Each match In RegEx_Matches_To_List(str, regex) : MsgBox(match) : Next
  9.  
  10.    End Sub
  11.  
  12. #Region " RegEx Matches To List "
  13.  
  14.    ' [ RegEx Matches To List Function ]
  15.    '
  16.    ' // By Elektro H@cker
  17.  
  18.    Private Function RegEx_Matches_To_List(ByVal str As String, ByVal RegEx_Pattern As String, _
  19.                                           Optional ByVal Group As Int32 = 0, _
  20.                                           Optional ByVal IgnoreCase As Boolean = True) _
  21.                                           As List(Of String)
  22.  
  23.        Dim regex_option As System.Text.RegularExpressions.RegexOptions
  24.  
  25.        If IgnoreCase Then regex_option = System.Text.RegularExpressions.RegexOptions.IgnoreCase _
  26.        Else regex_option = System.Text.RegularExpressions.RegexOptions.None
  27.  
  28.        Dim match As System.Text.RegularExpressions.Match = System.Text.RegularExpressions.Regex.Match(str, RegEx_Pattern, regex_option)
  29.        Dim Matches_List As New List(Of String)
  30.  
  31.        Do While match.Success
  32.            Matches_List.Add(match.Groups(Group).ToString)
  33.            match = match.NextMatch()
  34.            Application.DoEvents()
  35.        Loop
  36.  
  37.        Return Matches_List
  38.  
  39.    End Function
  40.  
  41. #End Region
  42.  
  43. End Class

Saludos.

Intenté entenderlo pero se me complicó, no sé muy bien de ese lenguaje y sé más de C++ en Windows Forms. Si pudieras ponerlo en el lenguaje que te menciono te lo agradecería.


Título: Re: ¿Cómo encontrar una cadena dentro de un párrafo de texto?
Publicado por: Eleкtro en 8 Junio 2013, 08:36 am
Intenté entenderlo pero se me complicó, no sé muy bien de ese lenguaje y sé más de C++ en Windows Forms. Si pudieras ponerlo en el lenguaje que te menciono te lo agradecería.

Cita de: Elektro H@cker
Código
  1. Dim regex As String = <a><![CDATA[(http://|https://|www)([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?]]></a>.Value


No, no sé C/C++/C#,
Copia ese RegEx, conviértelo a la sintaxis adecuada de C++ usando la aplicación "RegExBuddy", y ya tienes la primera parte del problema solucionada, el resto solo sería que aprendieses a usar las expresiones regulares en C++ (si no supieras).

Saludos