filter_var gibt nur false aus, wenn es fehlschlägt, d.h. einen unzulässigen Input kriegt, mit dem es nichts anfangen kann. Enthält der String nichts filterbares, wird er trotzdem gefiltert, weil filter_var mit Strings umgehen kann. Enthält der String etwas filterbares, wird es gefiltert und zurückgegeben.
FILTER_SANITIZE_FULL_SPECIAL_CHARS entspricht einer escape-Funktion (

), d.h. dein Input-String wird escapet und somit zugelassen.
Was du brauchst ist ein validation filter (

), dort den regex-Filter. Oder direkt den regex ohne Filter. Dafür dann eine beliebige String-Funktion (oder preg_match).
Möglich wäre es auch mit ctype (

), aber dann musst du sichergehen, dass deine Spracheinstellungen korrekt sind.