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>