Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

magda

procurar e-mail dentro de uma richtextbox

Recommended Posts

magda

Boas,

este é o meu primeiro tópico, e estou mesmo a precisar da vossa ajuda.

Sou iniciante na programação em vb.net, e estou a fazer um pequeno programa onde tenho um texto dentro de uma richtextbox e quero pesquisar se essa richtextbox tem alguma e-mail nesse texto. já fui a montes de sites e não consigo encontrar nada que me ajude :s por isso agradecia que alguém me ajudasse.

Eu tentei fazer o seguinte código mas esta a dar erro:

If eMail = "" Then
            NumCrescente = 1
            For num = 1 To Len(RichTextBox1.Text)
                STR = Mid(RichTextBox1.Text, NumCrescente, 1)
                If STR = "@" Then
                    Dim NumDecrescente As Long
                    For NumDecrescente = NumCrescente To 0 Step -1
                        STR = Mid(RichTextBox1.Text, NumDecrescente, 1)
                        If STR = "" Then
                            Dim ponto As Long
                            For ponto = NumDecrescente To Len(RichTextBox1.Text) Step 1
                                STR = Mid(RichTextBox1.Text, ponto, 1)
                                If STR = "." Then
                                    For EspacoDireita = ponto To Len(RichTextBox1.Text)
                                        STR = Mid(RichTextBox1.Text, EspacoDireita, 1)
                                        If STR = "" Or EspacoDireita = Len(RichTextBox1.Text) Then
                                            eMail = Mid(RichTextBox1.Text, NumDecrescente, (EspacoDireita - NumDecrescente))
                                            NumCrescente = EspacoDireita
                                            Exit Sub
                                        End If
                                    Next EspacoDireita
                                End If
                            Next ponto
                        End If
                    Next NumDecrescente
                End If
                NumCrescente = NumCrescente + 1
            Next num
        End If
        eMail = RichTextBox2.Text

Obrigada, Magda Pereira


Magda Pereira

Share this post


Link to post
Share on other sites
Tuntankamon

Isso é um bom trabalho para utilizares Regular Expressions...

O email deve ter algum formato especifico, tipo .pt, ou é livre?

Share this post


Link to post
Share on other sites
ribeiro55

Olá Magda, bem-vinda.

Os emails estão delimitados por espaços?

Ou queres procurar por emails, digamos em linguagem de marcação (onde é raro estarem delimitados por espaço)?


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
magda

Olá,

Os e-mails não estão necessariamente delimitados por espaços, pois eu quero procurar os e-mails no meio de HTML.

Eu quero procurar qualquer tipo de e-mail, sem nenhum formato especifico.

Obrigada.


Magda Pereira

Share this post


Link to post
Share on other sites
spipo

Olá Magda,

No Html que capturas, faz referencia por exemplo a isto?:

<a href="mailto:.....@....">.....@....</a>

Se a resposta é "SIM", e se em todos os Html que capturas por exemplo qualquer email referenciado no Html tenha, por exemplo:

<a href="mailto:pepe@pepe.com">pepe@pepe.com</a>

Pois entao, podes fazer o seguinte:

        Dim Html As String = pageHtml
        Dim Emails As New ArrayList

        While Html.Contains("mailto:")

            'posicionas até o começo do 'mailto:'
            Html = Html.Substring(Html.IndexOf("mailto:"))

            'parseamos o que nos interessa
            Dim strEmail As String = Html.Substring(0, Html.IndexOf(">"))

            'Fazemos um replace para eliminar o conteudo do email encontrado, dentro do conteudo Html
            Html = Replace(Html, strEmail, String.Empty)

            'fazemos uma vez mais um replace para ficar propriamente com o email
            strEmail = Replace(strEmail, "mailto:", String.Empty)

            'adicionamos o email no arraylist...
            Emails.Add(strEmail)

        End While

Por fin podes depois fazer uma funcao que devolve a arraylist y manejar como queiras.

Todo o código de prova:

        Dim client As New WebClient()
        Dim strHtml As String = String.Empty

        Try
            Dim pageData As [byte]() = client.DownloadData("http://www.sinis-tech.es/Contacto/tabid/55/Default.aspx")
            strHtml = System.Text.Encoding.ASCII.GetString(pageData)
        Catch x As WebException
            MsgBox(x.ToString)
        End Try

        If Not String.IsNullOrEmpty(strHtml) Then

            Dim Emails As New ArrayList

            While strHtml.Contains("mailto:")

                'posicionas até o começo do 'mailto:'
                strHtml = strHtml.Substring(strHtml.IndexOf("mailto:"))

                'parseamos o que nos interessa
                Dim strEmail As String = strHtml.Substring(0, strHtml.IndexOf(">"))

                'Fazemos um replace para eliminar o conteudo do email encontrado, dentro do conteudo Html
                strHtml = Replace(strHtml, strEmail, String.Empty)

                'fazemos uma vez mais um replace para ficar propriamente com o email
                strEmail = Replace(strEmail, "mailto:", String.Empty)

                'adicionamos o email no arraylist...
                Emails.Add(strEmail)

            End While

        End If


Saludos,Carlos Menezes

Share this post


Link to post
Share on other sites
magda

Olá Carlos,

obrigado pelo codigo, mas eu queria retirar do HTML todos os e-mail, e não só os que estivessem assim:

<a href="mailto:.....@....">.....@....</a>.

Eu estive a pesquisar sobre a dica do r00tfixxxer, sobre as regular expressions e acho que é  a melhor soluçao para resolver o meu problema, além de estar com algumas dificuldades. Já sei qual a regular expression a utilizar :

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

só nao sei como aplica-la no codigo    :S

Cumps,

Magda


Magda Pereira

Share this post


Link to post
Share on other sites
Tuntankamon

Hehehe

Como já fizeste algum trabalho de casa, já te posso ajudar.

Deves importar o namespace System.Text.RegularExpressions.

 Dim strMail As String = "[a-z\.]*@[a-z]*\.[a-z]{2,4}"
        Dim reg As New System.Text.RegularExpressions.Regex(strMail)
        Dim matches As System.Text.RegularExpressions.MatchCollection
        matches = reg.Matches("textoapesqueisar")
        If matches.Count > 0 Then
            For Each m As System.Text.RegularExpressions.Match In matches
                MsgBox(m.Value)
            Next
        End If

A expressão regular pode e deve ser afinada...

Share this post


Link to post
Share on other sites
magda

Obrigada r00tfixxxer pela ajuda.

O código está a funcionar a maneira, estou agora a "afina-lo" para funcionar da melhor maneira para aquilo que quero.

Quando acabar o código coloco-o aqui pois pode ser que ajude alguem que queria fazer algo parecido.


Magda Pereira

Share this post


Link to post
Share on other sites
ribeiro55

Um pequeno reparo:

Usa antes:

[a-z0-9-\.]*@[a-z]*\.[a-z]{2,4}

Com a expressão anterior não apanhavas emails como:

zeca123@qqcoisa.com ou zeca-martelo@qqcoisa.com


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Tuntankamon

Eu disse que a expressão precisava de afinação... :)

Tal como essa situação, existem muitas outras, tais como, os emails não poderem começar por números e terminar com números, etc...

Share this post


Link to post
Share on other sites
magda

Bem, Muito obrigado a todos pela ajuda. como prometi aqui fica o código, alem de nao saber se ainda vou alterar mais alguma coisa, acho que assim o codigo ja esta bastante completo.

Dim strMail As String = "[a-z0-9-\.]*@[a-z]*\.[a-z]{2,4}"
        Dim reg As New System.Text.RegularExpressions.Regex(strMail)
        Dim matches As System.Text.RegularExpressions.MatchCollection
        matches = reg.Matches(RichTextBox1.Text)
        If matches.Count > 0 Then
            For Each m As System.Text.RegularExpressions.Match In matches
                If ListBox1.Items.Contains(m.Value) Then
                    MsgBox("email ja colocado")
                Else
                    RichTextBox2.Text = RichTextBox2.Text & m.Value & ";"
                    ListBox1.Items.Add(m.Value)
                End If
            Next
        End If

Acho que pode-se dar este tópico como resolvido.


Magda Pereira

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.