filter_very neat and efficient for special purposes, but also limited.
you as well get only a filtered return string that you have to compare against the original string to see whether it fits.
there may be certain requirements and/or structures beside the allowed characters that you cannot check against in this way.
the most common way is to use pcre functions and especially preg_match.
its very efficient as well and you can directly work with the return value.
and you have the whole possibilities of regular expressions.
image for example you want to validate for every occouring name to be in the exacmt form "Mr/Mrs Firstname Lastname, akademic-title".
when it gets tricky is if you only want to allow certain ranges of unicode characters.
for example if you only want to allow U+0600–U+06FF (1536–1791) (arabic). plus a certain range of dingbats and brackets or something.
there are no pre defined character classes for that and defining them would be not so ellegant.
in this case the best way really would be looping over the text character by character and checking for ranges...