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

Cybernavigator

[C#] Obter String Entre Tags

10 mensagens neste tópico

[Atenção, esta class está desactualizada, a nova class encontra-se aqui.]

Boas tardes, decidi dedicar-me um pouco a C# e vi-me forçado a criar duas classes, uma para fazer post e gets mantendo a sessão aberta (do género, faço o post com o login e continuo a obter sources de páginas com o login feito) e outra para obter strings entre tags.

Venho aqui apresentar a que obtém strings entre tags.

Caso queiram o Wrapper de http digam.

Antes de mais quero dizer que estou aberto a sugestões e a dúvidas que surjam.

A Class que criei é esta

namespace Pr00f.Strings
{
   class StringClass
   {
       public int ArrayLength = 0;
       public string InBetween(string StrSource, string StrStart, string StrEnd, ref int Starting)
       {
           int loc1 = StrSource.IndexOf(StrStart, Starting);
           int loc2;
           if (loc1 > -1)
               StrSource = StrSource.Substring(loc1 + StrStart.Length);
           loc2 = StrSource.IndexOf(StrEnd);
           if (loc2 > -1)
               StrSource = StrSource.Remove(loc2, StrSource.Length - loc2);
           if ((loc1 < 0) && (loc2 < 0))
           {
               Starting = -1;
               return "";
           }
           Starting = loc1;
           return StrSource;
       }
       public string InBetween(string StrSource, string StrStart, string StrEnd, int Starting)
       {
           int loc1 = StrSource.IndexOf(StrStart, Starting);
           int loc2;
           if (loc1 > -1)
               StrSource = StrSource.Substring(loc1 + StrStart.Length);
           loc2 = StrSource.IndexOf(StrEnd);
           if (loc2 > -1)
               StrSource = StrSource.Remove(loc2, StrSource.Length - loc2);
           if ((loc1 < 0) && (loc2 < 0))
           {
               Starting = -1;
               return "";
           }
           return StrSource;
       }
       public string[] GetAllBetween(string StrSource, string StrStart, string StrEnd)
       {
           int Position = 0;
           int Count = -1;
           while (Position >= 0)
           {
               Position = StrSource.IndexOf(StrStart, Position);
               Position++;
               if (Position == 0)
                   Position = -1;
               Count++;
           }
           string[] result = new string[Count];
           Position = 0;
           for (int i = 0; i < Count; i++)
           {
               /*Position = StrSource.IndexOf(StrStart, Position);
               if (Position>=0)
                   result[i] = InBetween(StrSource, StrStart, StrEnd, Position);
               Position++;*/
               result[i] = InBetween(StrSource, StrStart, StrEnd,ref Position);
               Position++;
               //System.Windows.Forms.MessageBox.Show(Position.ToString());
           }
           ArrayLength = Count;
           return result;
       }
   }
}

Deixo aqui exemplos de uso e os resultados.

Não se esqueçam de adicionar

using Pr00f.Strings;

Deixo então aqui a forma de uso das funções da class e os seus resultados

        private void button1_Click(object sender, EventArgs e)
       {
           StringClass StrC = new StringClass();
           string resultado;
           //Exemplo 1 - Obter uma string entre 2 blocos de texto
           resultado = StrC.InBetween("Ola P@P!", "O", "P!", 0);
           //resultado é "la P@"

           //Exemplo 2 - Obter uma string entre 2 blocos e a posição em que ela começa
           int Posicao = 0;
           resultado = StrC.InBetween("Isto dá mesmo imenso jeito", "mesmo ", " jeito", ref Posicao);
           /* O valor de Posicao é 8
            * O resultado é "imenso" */

           //Exemplo 3 - Obter todas as Strings entre tags encontradas
           string[] obtido = StrC.GetAllBetween("<tag>Valor 1</tag>\n<tag>Valor 2</tag>", "<tag>", "</tag>");
           /* obtido[0] = "Valor 1"
            * obtido[1] = "Valor 2" */
       }

Espero que isto vos ajude, a mim dá-me um jeitaço visto que não percebo nada de RegEx :P

Espero as vossas sugestões e ideias para aumentar a Class =)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Este código também pode ser utilizado por exemplo, em vez de obtermos a uma palavra no meio de uma string, substituirmos esse palavra por outra??

ex:  "resultado = StrC.InBetween("Isto dá mesmo imenso jeito", "mesmo ", " jeito", ref Posicao);

            /* O valor de Posicao é 8

            * O resultado é "imenso" */"

    ter isto e agora substituir na string original ("Isto da mesmo imenso jeito") imenso por muito, por exemplo..

obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm, para isso podes usar o replace, tipo

string m_Str = "Isto da mesmo imenso jeito";
m_Str = m_Str.Replace("imenso","muito");
//resultado de m_Str = "Isto da mesmo muito jeito"

Pode-se fazer uma função para isso, mas seria mais inverter as palavras.

para esse caso criei esta função que já meti na class

        public string SwitchWords(string StrSource, string FstWord, string SndWord)
        {
            StrSource = StrSource.Replace(FstWord, "aprimeirapalavraficaraaqui");
            StrSource = StrSource.Replace(SndWord, FstWord);
            StrSource = StrSource.Replace("aprimeirapalavraficaraaqui", SndWord);
            return StrSource;
        }

e usei da mesma forma que lá em cima

            StringClass StrC = new StringClass();
            string resultado = StrC.SwitchWords("Isto dá mesmo imenso jeito", "mesmo", "jeito");
            //Resultado "Isto dá jeito imenso mesmo"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque não em vez de estares a criar a class StringClass, pores antes esses métodos a estender a class String.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

http://msdn.microsoft.com/en-us/library/bb383977.aspx

Basicamente toda a tua classe fica estática. E em cada método metes como 1º parâmetro a String que será usada.

Por exemplo no caso do método InBetween ficava:

public static string InBetween(this string StrSource, string StrStart, string StrEnd, int Starting)

E depois para usares o método

string resultado = "Ola P@P!".InBetween("O", "P!", 0);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não consegui, tou a usar o C# 2k5 será disso?

Yep. Foi algo que foi adicionado no C#3.0
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ahhhh, então está explicado porque nunca tinha ouvido falar nisso. Vou tratar de fazer o "upgrade" :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, venho fazer este post para actualizar a minha class.

namespace Pr00f.Strings
{
    public static class StringClass
    {
        #region PrivateFunctions
        //Verifica se a tag esta exactamente correcta (por exemplo ao chamar a tag "ingrediente" ele pode colidir com a "ingredientes", esta função evita-o se chamada no sítio certo )
        private static bool ExactTag(this string StrSource, string Tag, ref int Starting)
        {
            string starttag = StrSource.InBetween("<" + Tag.Replace(">", "").Replace("<", ""), ">", ref Starting);
            string testtag = Tag.Replace("<", "").Replace(">", "") + starttag;
            string[] testword = testtag.Split((char)' ');
            if (testword[0] == Tag.Replace("<", "").Replace(">", ""))
                return true;
            else
                return false;
        }

        //Verifica se a tag e o parâmetro estão correctos
        private static bool ExactTagAndParam(this string StrSource, string Tag, string Parameter, ref int Starting)
        {
            string starttag = StrSource.InBetween("<" + Tag.Replace(">", "").Replace("<", ""), ">", ref Starting);
            string testtag = Tag.Replace("<", "").Replace(">", "") + starttag;
            string[] testword = testtag.Split((char)' ');
            if (testword[0] == Tag.Replace("<", "").Replace(">", ""))
            {
                if (testtag.IndexOf(Parameter) >= 0)
                    return true;
                else
                    return false;
            }
            else
                return false;
        }
        #endregion PrivateFunctions

        #region PrivateFunctionsExtender
        private static bool ExactTag(this string StrSource, string Tag, int Starting)
        {
            return ExactTag(StrSource, Tag, ref Starting);
        }
        private static bool ExactTag(this string StrSource, string Tag)
        {
            return ExactTag(StrSource, Tag, 0);
        }

        private static bool ExactTagAndParam(this string StrSource, string Tag, string Parameter, int Starting)
        {
            return ExactTagAndParam(StrSource, Tag, Parameter, ref Starting);
        }
        private static bool ExactTagAndParam(this string StrSource, string Tag, string Parameter)
        {
            return ExactTagAndParam(StrSource, Tag, Parameter, 0);
        }
        #endregion PrivateFunctionsExtender

        #region PublicFunctions
        //Obtém o que está entre dois blocos de texto
        public static string InBetween(this string StrSource, string StrStart, string StrEnd, ref int Starting)
        {
            if (Starting < 0)
            {
                Starting = -1;
                return "";
            }
            int loc1 = StrSource.IndexOf(StrStart, Starting);
            int loc2;
            if (loc1 > -1)
                StrSource = StrSource.Substring(loc1 + StrStart.Length);
            loc2 = StrSource.IndexOf(StrEnd);
            if (loc2 > -1)
                StrSource = StrSource.Remove(loc2, StrSource.Length - loc2);
            if ((loc1 < 0) && (loc2 < 0))
            {
                Starting = -1;
                return "";
            }
            Starting = loc1;
            return StrSource;
        }

        //Obtém todos os resultados até ao fim de uma string, encontrados entre dois blocos de texto
        public static string[] GetAllBetween(this string StrSource, string StrStart, string StrEnd, int Starting)
        {
            int Position = Starting;
            int Count = -1;
            while (Position >= 0)
            {
                Position = StrSource.IndexOf(StrStart, Position);
                Position++;
                if (Position == 0)
                    Position = -1;
                Count++;
            }
            string[] result = new string[Count];
            Position = Starting;
            for (int i = 0; i < Count; i++)
            {
                result[i] = InBetween(StrSource, StrStart, StrEnd,ref Position);
                Position++;
            }
            return result;
        }

        //Obtém o que está dentro de uma Tag
        public static string GetBetweenTag(this string StrSource, string Tag, ref int Starting)
        {
            string starttag = "";
            string endtag = "</" + Tag.Replace("<", "").Replace(">", "") + ">"; ;
            bool flag = true;
            while (flag)
            {
                if (ExactTag(StrSource, Tag, ref Starting))
                {
                    flag = false;
                    starttag = StrSource.InBetween("<" + Tag.Replace(">", "").Replace("<", ""), ">", ref Starting);
                }
                else
                    Starting++;
            }
            if (Tag.IndexOf("<") == -1)
                starttag = "<" + Tag.Replace(">", "") + starttag + ">";
            else
                starttag = Tag.Replace(">", "") + starttag + ">";
            return StrSource.InBetween(starttag, endtag, ref Starting);
        }

        //Obtém o valor de um Parâmetro dentro de uma Tag
        public static string GetParamInsideTag(this string StrSource, string Tag, string Parameter,ref int Starting)
        {
            string m_tag = "";
            bool flag = true;
            while (flag)
            {
                if (ExactTag(StrSource, Tag, ref Starting))
                {
                    flag = false;
                    m_tag = StrSource.InBetween("<" + Tag.Replace(">", "").Replace("<", ""), ">", ref Starting);
                }
                else
                    Starting++;
            }
            string[] resultado = m_tag.Split((char)'=');
            for (int i = 0; i < resultado.Length; i++)
            {
                if (resultado[i].IndexOf(Parameter) >= 0)
                {
                    string toreturn = resultado[i + 1].InBetween("\"", "\"");
                    if (toreturn.Length > 0)
                        return toreturn;
                    else
                        return resultado[i + 1].GetWord(0, false).Replace("\"", "\"");
                }
            }
            return m_tag;
        }

        //Obtém o valor de um Parâmetro dentro de uma Tag até chegar ao fim do source
        public static string[] GetAllParamInsideTag(this string StrSource, string Tag, string Parameter, int Starting)
        {
            int Position = Starting;
            int Count = 0;
            while (Position >= 0)
            {
                Position = StrSource.IndexOf("<" + Tag.Replace(">", "").Replace("<", ""), Position);
                if (ExactTagAndParam(StrSource, Tag, Parameter, Position))
                    Count++;
                Position++;
                if (Position == 0)
                    Position = -1;
            }
            string[] result = new string[Count];
            Position = Starting;
            for (int i = 0; i < Count; i++)
            {
                result[i] = GetParamInsideTag(StrSource, Tag, Parameter, ref Position);
                Position++;
            }
            return result;
        }

        //Obtém o que está dentro de uma Tag até chegar ao fim do source
        public static string[] GetAllBetweenTag(this string StrSource, string Tag, int Starting)
        {
            int Position = Starting;
            int Count = -1;
            while (Position >= 0)
            {
                Position = StrSource.IndexOf("<" + Tag.Replace(">", "").Replace("<", ""), Position);
                if (ExactTag(StrSource, Tag, Position))
                    Count++;
                Position++;
                if (Position == 0)
                    Position = -1;
            }
            string[] result = new string[Count];
            Position = Starting;
            for (int i = 0; i < Count; i++)
            {
                result[i] = GetBetweenTag(StrSource, Tag, ref Position);
                Position++;
            }
            return result;
        }

        //Troca duas palavras entre si
        public static string SwitchWords(this string StrSource, string FstWord, string SndWord)
        {
            StrSource = StrSource.Replace(FstWord, "aprimeirapalavraficaraaqui");
            StrSource = StrSource.Replace(SndWord, FstWord);
            StrSource = StrSource.Replace("aprimeirapalavraficaraaqui", SndWord);
            return StrSource;
        }

        //Conta o número de palavras
        public static int WordCount(this string StrSource)
        {
          System.Text.RegularExpressions.MatchCollection collection = System.Text.RegularExpressions.Regex.Matches(StrSource, @"[\S]+");
          return collection.Count;
        }

        //Obtém a palavra com o número desejado
        public static string GetWord(this string StrSource, int WordNumber, bool FirstWordIsNumber1)
        {
            System.Text.RegularExpressions.MatchCollection collection = System.Text.RegularExpressions.Regex.Matches(StrSource, @"[\S]+");
            if (FirstWordIsNumber1)
                return collection[WordNumber - 1].ToString();
            else
                return collection[WordNumber].ToString();
        }
        #endregion PublicFunctions

        #region PublicFunctionsExtender
        public static string GetWord(this string StrSource, int WordNumber)
        {
            return GetWord(StrSource, WordNumber, false);
        }

        public static string SwitchWords(this string StrSource, int FstWord, int SndWord, bool FirstWordIsNumber1)
        {
            return SwitchWords(StrSource, GetWord(StrSource, FstWord, FirstWordIsNumber1), GetWord(StrSource, SndWord, FirstWordIsNumber1));
        }
        public static string SwitchWords(this string StrSource, int FstWord, int SndWord)
        {
            return SwitchWords(StrSource, GetWord(StrSource, FstWord, false), GetWord(StrSource, SndWord, false));
        }

        public static string[] GetAllBetweenTag(this string StrSource, string Tag)
        {
            return GetAllBetweenTag(StrSource, Tag, 0);
        }

        public static string[] GetAllParamInsideTag(this string StrSource, string Tag, string Parameter)
        {
            return GetAllParamInsideTag(StrSource, Tag, Parameter, 0);
        }

        public static string GetParamInsideTag(this string StrSource, string Tag, string Parameter, int Starting)
        {
            return GetParamInsideTag(StrSource, Tag, Parameter, ref Starting);
        }
        public static string GetParamInsideTag(this string StrSource, string Tag, string Parameter)
        {
            return GetParamInsideTag(StrSource, Tag, Parameter, 0);
        }

        public static string GetBetweenTag(this string StrSource, string Tag, int Starting)
        {
            return StrSource.GetBetweenTag(Tag, ref Starting);
        }
        public static string GetBetweenTag(this string StrSource, string Tag)
        {
            return StrSource.GetBetweenTag(Tag, 0);
        }

        public static string[] GetAllBetween(this string StrSource, string StrStart, string StrEnd)
        {
            return GetAllBetween(StrSource, StrStart, StrEnd, 0);
        }

        public static string InBetween(this string StrSource, string StrStart, string StrEnd, int Starting)
        {
            return InBetween(StrSource, StrStart, StrEnd, ref Starting);
        }
        public static string InBetween(this string StrSource, string StrStart, string StrEnd)
        {
            return InBetween(StrSource, StrStart, StrEnd, 0);
        }
        #endregion PublicFunctionsExtender
    }
}

O que havia na class:

InBetween("um pequeno exemplo", "um ", " exemplo", OndeComeçar); //Retorna uma string com o valor pequeno
GetAllBetween("meu pequeno teste\nmeu segundo teste", "meu ", " teste"); //Retorna um vector de string com os valores { "pequeno", "segundo" }

O que há de novo:

Usei o método que o Betovski disse, e estendi a class string

Desta forma pode-se chamar as funções assim

string ola = "meu pequeno teste\nmeu segundo teste";
string[] teste = ola.GetAllBetween("meu ", " teste");
/*
*teste[0] == "pequeno"
*teste[1] == "segundo"
*/

Novas funções:

  • GetBetweenTag
  • GetParamInsideTag
  • GetAllParamInsideTag
  • GetAllBetweenTag
  • SwitchWords
  • WordCount
  • GetWord

Como usar as funções:

  • Como usar a função GetBetweenTag e GetParamInsideTag

//Como usar a função GetBetweenTag e GetParamInsideTag
string Teste = "<td class=\"bottom\"><span class=smallfont><center><h2><font color=red>Support</font> "

string Resultado = Teste.GetBetweenTag("font");

string ResultadoParametro = Teste.GetParamInsideTag("span", "class");

/*
* Resultado == "Support";
* ResultadoParametro == "smallfont";
*/

  • Como usar a função GetAllBetweenTag e GetAllParamInsideTag

//Como usar a função GetAllBetweenTag e GetAllParamInsideTag
string XML = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>" +
            "<receita nome=\"pão\" tempo_de_preparo=\"5 minutos\" tempo_de_cozimento=\"1 hora\">" +
            "  <titulo>Pão simples</titulo>" +
            "  <ingredientes>\n    <ingrediente quantidade=\"3\" unidade=\"xícaras\">Farinha</ingrediente>" +
            "    <ingrediente quantidade=\"7\" unidade=\"gramas\">Fermento</ingrediente>" +
            "    <ingrediente quantidade=\"1.5\" unidade=\"xícaras\" estado=\"morna\">Água</ingrediente>" +
            "    <ingrediente quantidade=\"1\" unidade=\"colheres de chá\">Sal</ingrediente>" +
            "  </ingredientes>\n  <instrucoes>\n    <passo>Misture todos os ingredientes, e dissolva bem.</passo>" +
            "    <passo>Cubra com um pano e deixe por uma hora em um local morno.</passo>" +
            "    <passo>Misture novamente, coloque numa bandeja e asse num forno.</passo>\n  </instrucoes>\n</receita>";

string[] Resultado = XML.GetAllBetweenTag("ingrediente");

string[] ResultadoParametro = XML.GetAllParamInsideTag("ingrediente", "unidade");

/*
* Resultado[0] == "Farinha" && Resultado[1] == "Fermento" && Resultado[2] == "Água" && Resultado[3] == "Sal" 
*
* ResultadoParametro[0] == "xícaras" && ResultadoParametro[1] == "gramas" && ResultadoParametro[2] == "xícaras" && ResultadoParametro[3] == "colheres de chá";
*/

  • Como usar a função WordCount, SwitchWords e GetWord

//Como usar a função WordCount, SwitchWords e GetWord
string Teste ="Esta string apenas serve para dar exemplos";

int NumeroDePalavras = Teste.WordCount();
//NumeroDePalavras == "7"

string PalavraNumero4 = Teste.GetWord(4, true); //A variável booleana que a função pede é para definir se a primeira palavra é  o número 1 ou 0
//PalavraNumero4 == "serve"

PalavraNumero4 = Teste.GetWord(4);
//PalavraNumero4 == "para"

PalavraNumero4 = Teste.GetWord(4, false);
//PalavraNumero4 == "para"

string TrocaDePalavras = Teste.SwitchWords("string", "dar");
//TrocaDePalavras == "Esta dar apenas serve para string exemplos"

TrocaDePalavras = Teste.SwitchWords(2, 5);
//TrocaDePalavras == "Esta string dar serve para apenas exemplos"

TrocaDePalavras = Teste.SwitchWords(2, 5, false); //A variável booleana que a função pede é para definir se a primeira palavra é  o número 1 ou 0
//TrocaDePalavras == "Esta string dar serve para apenas exemplos"

TrocaDePalavras = Teste.SwitchWords(2, 5, true);
//TrocaDePalavras == "Esta para apenas serve string dar exemplos"

Bom com isto concluo a apresentação da class actualizada.

Espero que gostem, e espero as vossas sugestões e ideias.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora