Ir para o conteúdo

Função de pesquisa avançada de Texto

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.