Dia desse eu vi na internet um dúvida simples, mas interessante . Alguém postou querendo saber: “Como remover tags HTML em C?” .
Rapidamente veio em minha mente RegEx, mas com C++ .
Se você entende de Expressões Regulares com C++ é realmente muito fácil, basta:
<regex>
;regex_replace()
para substituir pela string deseja.Em resumo o código é esse:
#include <iostream>
#include <regex>
int main(){
std::string html = "<a href=\"https://terminalroot.com.br/\">Esse é um link</a>";
std::regex tags("<[^>]*>");
std::string remove{};
std::cout << std::regex_replace(html, tags, remove) << '\n';
return 0;
}
Provável saída:
Esse é um link
Mas, em Linguagem C realmente as coisas não são tão fáceis assim.
Você pode usar a regex.h
em C, mas ela verificará padrões somente, mas a substituição vai ficar por sua conta.
Por exemplo, verificar se determinada string há tags nela, podemos usar assim:
#include <stdio.h>
#include <regex.h>
int main(){
regex_t regex;
int check_regex = regcomp(®ex, "<[^>]*>", REG_EXTENDED);
check_regex = regexec(®ex, "<p>Tag</p>", 0, NULL, 0);
!check_regex ? printf("Tem tags!\n") : printf("Não tem tags.\n");
regfree(®ex);
return 0;
}
Provável saída:
Tem tags!
Para mais informações acesse a página de POSIX do manual pelo comando:
man regex.h
Após você verificar se uma determinada string possui tags(economiza processamento) o próximo passo é você remover as tags.
Eu criei uma soluçao própria(e simples 💡 ) que pode ser contestada pelos amantes do C, mas ela funciona 😎 . O código em si é:
stdio.h
para usar o printf
;string.h
para usar o strlen
;stdbool.h
para usar o tipo bool
SIZE
para otimizar o desempenhochar *
para redefinição . E essa função é o seguinte:
for
para percorrer a string de acordo com a quantidade de caracteres dela;<
foi identificado na string;tag
como true
out[SIZE];
false
somente após identificar o caractere >
de fechamento de tags.O código final é:
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define SIZE 4096
char * remove_tags(char string[]){
bool tag = false;
char out[SIZE];
for(int i = 0; i < strlen(string); i++){
if( string[i] == '<'){
tag = true;
}
if(!tag){
strncat(out, &string[i], 1);
}
if(string[i] == '>'){
tag = false;
}
}
string = out;
return string;
}
int main(){
char string[SIZE] = "<a href=\"https://terminalroot.com.br/\">Esse é um link</a>";
printf("%s\n", remove_tags(string));
return 0;
}
Provável saída:
Esse é um link
O certo seria alocarmos espaço na heap, pois uma string que contém um documento HTML pode ser gigante. Mas para fins didáticos, e entender a lógica, tá de bom tamanho.
Até a próxima!