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.