Como extrair apenas o texto de um conteúdo HTML

Qualquer que seja a linguagem de programação, para ela ser considerada boa suficiente precisa ter os comandos necessários de estrutura de loop, condicionantes, variáveis e alguns outros elementos. O mesmo vale para linguagens procedurais SQL(psql daqui em diante).

Talvez um excelente exemplo para provar o valor da linguagem psql do banco de dados FirebirdSQL seja como extrair de um conteúdo HTML apenas o texto. Eu fiz o exemplo abaixo alguns anos atrás com base noutro código que extraía o conteúdo de um RTF. Comparado a extração de um RTF, a extração a partir de um HTML é bem mais simples porque envolve apenas remover o que está entre os delimitadores “<” e “>”

O código abaixo fará essa extração, mas ao invés de você apenas “copiar” e “colar” para suas atividades, estude-o, veja a lógica utilizada porque se você entendê-la poderá usar a mesma lógica para extrair apenas conteúdos desejados de formulários ou até mesmo de arquivos PDF e Postscript.

O psql abaixo está no formato do FirebirdSQL para SQL Functions, SQL Functions são funções que retornam apenas 1 tipo de informação, no exemplo abaixo ela se chamará GET_UNHTML e tem um parâmetro de entrada que é um blob do tipo texto e retorna o conteúdo como blob em formato blob texto também, porém plain-text.

create or alter function GET_UNHTML (
    P_SOURCE_HTML blob sub_type text)
returns blob sub_type text
as
declare variable TAGSTART integer;
declare variable TAGFINISH integer;
declare variable TAGFOUND blob sub_type text;
declare variable RESULT_TEXT blob sub_type text;
BEGIN
  /* essa procedure/função retorna um texto (blob) sem a porção de
   codigo de tags HTML resultando em conteúdo texto plain-text, ex:
   ret=GET_UNHTML(<html>texto<b> sem as tags</b></html>);
   O resultado será o texto sem os códigos de controle RTF:
   texto puro sem as tags html
   Portanto, plain-text!
   Muito útil para tornar um texto HTML analisável por um programa ou outra psql
   by gladiston.santana[em]gmail.com
  */
  result_text='';
  p_source_html=trim(:p_source_html);

  tagstart = position ('<', :p_source_html);
  while (:tagstart > 0) do
  begin
    tagfinish = position ('>', :p_source_html, :tagstart);
    if (:tagfinish<:tagstart) then
      tagfinish=char_length(:p_source_html);
    tagfound = substring (:p_source_html from :tagstart for ((:tagfinish - :tagstart) + 1));
    p_source_html = replace (:p_source_html, :tagfound, '');
    tagstart = position ('<', :p_source_html);
  end
  
  result_text = :p_source_html;

  return result_text;
END

Modo de usar:

texto_puro=GET_UNHTML(string_html);

Conclusão

Vale esclarecer que operações com blobs não são performáticas, extrair um plain-text de um blob HTML leva tempo e se você precisa fazer isso num grupo de registros em loop para procurar um CPF, CNPJ ou algo do tipo talvez esteja fazendo isso do jeito errado. Situações que requerem máxima performance, talvez seja melhor pagar um preço maior e adicionar mais um campo para armazenar a mesma versão do conteúdo HTML porém plain-text, é certo que isso quase dobrará o armazenamento, porém em contrapartida terá uma versão HTML analisável já pronta e obterá a melhor performance possível para suas buscas ou analises. Claro que ao usar essa solução, analise se extrairá o plain-text no lado cliente ou usar essa SQL Function no lado servidor, escolha a opção que no seu contexto se encaixar melhor.