Próbowałem napisać w C funkcję strip_tags, która istnieje w PHP. W tym miejscu chciałem powiedzieć, że wiem, że istnieje biblioteka do operacji na stringach w C znana jako better string library, ale brak jej pożądnego manuala, więc zaczołem sam pisać sobie funkcje które potrzebuje użyć, które normalnie znajdują się w PHP.
Ale do rzeczy:
w trakcie tworzenia funkcji
char *strip_tags(char *value, char *allow)
doszedłem do wniosku że tagi, które mogą być przepuszczone będę zapisywał w tablicy char **, później stwierdziłem, że wyszukiwanie tagów przepuszczalnych najszybciej odbywałoby się gdybym zastosował coś podobnego do drzewa. Stworzyłem więc strukturę:
struct striptags
{
int number, end;
struct striptags **alphabet, *back;
}
To może drobna legenda co do zmiennych użytych w tej strukturze:
int number - mówi nam ile ścieżek prowadzi przez ten wierzchołek
int end - 0, gdy wyraz nie konczy sie na tym węźle lub 1 gdy wyraz konczy się na tym węźle.
struct striptags *alphabet - tablica zawierająca 26 wskaźników typu struct striptags, dlaczego 26 ? bo tyle jest liter w alfabecie łacińskim
struct striptags *back - wskaźnik do wierzchołka rodzica
a teraz główna funkcja:
//wpisywanie tagow do tablicy stringów
for(i=0;i<alen;i++){
if(allow[i]=='<'){
start=i+1;
continue;
}
if(allow[i]=='>'){
koniec=i;
//printf("%d|%d\n",start,koniec);
tags[j]=(char*)malloc((koniec-start+1)*sizeof(char));
for(k=start;k<koniec;k++){
//printf("%c",allow[k]);
tags[j][k-start]=allow[k];
}
tags[j][koniec-start]='\0';
j++;
//printf("\n");
}
}
//utworzenie drzewa tagow
for(i=0;i<ile;i++){
tmp=strlen(tags[i]);
prev=root;
for(j=0;j<tmp;j++){
//tags[i][j]
ch=(int)tags[i][j];
if(ch>64 && ch<91)
ch+=32;
ch-=97;
printf("%d ",ch);
if(prev->alphabet[ch]==NULL){
next=(struct striptags*)malloc(sizeof(struct striptags));
StripTagsNewNode(next);
prev->alphabet[ch]=next;
if (prev==root && root->alphabet[ch]!=NULL) printf("root %c NOT NULL",tags[i][j]);
next->back=prev;
prev->number++;
prev=next;
} else {
prev=prev->alphabet[ch];
}
}
printf("\n");
prev->end=1;
printf("%s %d\n",tags[i],tmp);
}
if(root->alphabet[1]!=NULL) printf(">>root b NOT NULL\n");
przy uruchomieniu funkcji
strip_tags("tresc","<a><b><big>")
wewnątrz funkcji tworzacej drzewko tagów wypisywane są informacjie, że a i b są wskaźnikami z korzenia, natomiast jak na końcu sprawdzam, czy wskaźnik root->alphabet[1] (litera b) istnieje w korzeniu to uzyskuje informacje, że wskaźnik jest pusty (NULL)</b>