Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

nunopicado

Função de pesquisa avançada de Texto

Mensagens Recomendadas

nunopicado

A seguinte função permite verificar a existência de uma string (ou mais) dentro de outra.

  • Do tipo Boolean, devolve o valor True se alguma das substrings passadas existir dentro da string principal, False se não existir
  • Aceita mais do que uma substring, ou seja, basta que exista uma das substrings dentro da string para o resultado ser positivo
  • Para cada substring, pode aceitar mais do que uma expressão, ou seja, para uma substring ser encontrada, todas as expressões dessa substring têm de existir

  • Separador de Substrings: &
  • Separador de expressões: %

Exemplo de Utilização, assumindo como conteúdo da string principal o seguinte texto:

"O Delphi é muito utilizado no desenvolvimento de aplicações desktop, aplicações multicamadas e cliente/servidor, compatível com os bancos de dados mais conhecidos do mercado. O Delphi pode ser utilizado para diversos tipos de desenvolvimento de projeto, abrangendo desde Serviços a Aplicações Web e CTI. O nome Delphi é inspirado na cidade de Delfos, o único local na Grécia antiga em que era possível consultar o Oráculo de Delfos. O nome deve-se ao fato de que os desenvolvedores do compilador buscavam uma ferramenta capaz de acessar o banco de dados Oracle - daí o trocadilho: "a única maneira de acessar o oráculo é usando Delphi". Pronuncia-se "dél-fi"."

- Pesquisa por 'xpto&não sei o quê' - False

- Pesquisa por 'Delphi&não sei o quê' - True

- Pesquisa por 'Delphi Oracle&não sei o quê' - False

- Pesquisa por 'Delphi%Oracle&não sei o quê' - True

- Pesquisa por 'Delphi Oracle&ferramenta capaz' - True

- Pesquisa por 'Delphi%Oracle&Oráculo%Delfos' - True

function AdvSearch(SubStr:String;const Str:String):Boolean;
var
   i:integer;  // Variável de apoio ao ciclo
   Expressions:TStringList;  // Armazém de expressões
   Sub:String;  // Armazém de SubStrings;
   Valido:Boolean;  // Flag de verificação

begin
   // Cria a StringList e inicializa o resultado
   Expressions:=TStringList.create;  
   Result:=false;

   //Prepara a SubStr
   SubStr:=SubStr+'&';  // Adiciona um delimitador de SubString ao final
   SubStr:=StringReplace(SubStr, '&&', '&', [rfReplaceAll]); // Elimina delimitadores repetidos
   
   // Corre a variável SubStr, uma SubString de cada vez
   while (pos('&',SubStr)>0) and (not result) do  // Executa a pesquisa enquanto houverem substrings não processadas, ou nenhuma substring for encontrada
      begin
          Sub:=Copy(SubStr,1,pos('&',SubStr)-1);  // Extrai a primeira SubString...
          Delete(SubStr,1,pos('&',SubStr));  // Apaga da variável SubStr a string encontrada
           
          //Prepara a SubString encontrada
          SubStr:=SubStr+'%';  // Adiciona um delimitador de SubString ao final
          SubStr:=StringReplace(SubStr, '%%', '%', [rfReplaceAll]); // Elimina delimitadores repetidos

          Expressions.Clear;  // Limpa a lista de expressões
          while pos('%',Sub)>0 do  // Percorre a substring e adiciona cada expressão encontrada à stringlist.
             begin
                Expressions.Add(Copy(Sub,1,Pos('%',Sub)-1));  // Adiciona a expressão à stringlist
                Delete(Sub,1,pos('%',Sub));  // Elimina a expressão encontrada
             end;
           
          // Verificação de existencia
          Valido:=true;  // Assume à partida que vai encontrar o texto

          // Percorre as expressões encontradas, e verifica se todas existem no texto (variável Str). Para o resultado de uma expressão ser True, todas as palavras de todas as expressões têm de ser encontradas
          for i:=0 to Expressions.Count-1 do
             if Pos(UpperCase(Expressions[i]),Uppercase(Str))=0   // Verifica a não existência da expressão (Case Insensitive), e se não for encontrada, Invalida a expressão e sai do ciclo
                then begin
                          Valido:=false;
                          Break;
                      end;

          // Se a flag Valido ainda for True, significa que a expressão foi encontrada correctamente, pelo que o resultado da função também é true
          if Valido then Result:=true;
      end;

      // Liberta o armazém de expressões
      Expressions.free;
end;


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Gracias...  :(


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.