Se fai in_array() verrà eseguita una comparazione tra stringhe, quindi ovviamente hai il comportamento che descrivi.
E' come se facessi
if ("78.134.94.192" == $ip)
sarà true solo se anche dentro $ip c'è lo stesso indirizzo, nella comparazione tra stringhe non esistono caratteri jolly, quindi niente *
allo stesso modo se usi le altre versioni, saranno
if ("78.134.94.0/8" == $ip)
if ("78.134.94.*" == $ip)
if ("78.134.94." == $ip)
chiaramente vere solo se dentro $ip c'è esattamente la stringa indicata prima di ==
Per risolvere dovresti usare le espressioni regolari, quelle ti consentono di trovare un match parziale sulle stringhe.
Per esempio
Codice PHP:
if ( preg_match('/^78.134.94/', $ip) )
{
// è un IP da bloccare
}
else
{
// IP buono
}