Esta es una FAQ. La respuesta rápida ? Te estas metiendo en un problema muy dificil de resolver. Por más que hagas te pondrán malas palabras.
Cómo saber que tu sistema funciona ? Para este problema necesitas unas pruebas de unidad. Lo que podrías hacer es crear un string enorme con todas las palabras y combinaciones de palabras que se te antojen y después pasarlas por tu función de filtrado. El resultado tendría que ser un string vació pues filtró todas las palabras.
He aqui un link a mi wiki donde explico un poco más el problema:
Qué tomar en cuenta para filtrar palabras prohibidas