Visto posso dirti che le espressioni regolari funzionano correttamente.. però non riesco a capire cosa hai fatto all infizio le 2 funzioni.. e poi successivamente fai un if per ogni campo es:
if(!control_char($username)) {
header ("Location: login_failed.php");
exit;
}
Perchè metti !negato..C'è se io inserissi un carattere del tipo % deve ritronare indietro.e ovviamente bloccare lo script.. però può capitare anche che si manifestano piu errori .. in questo caso hai messo exit() nell if che controlla l'username... però se si manifesta anche per l'email?
e poi se il campo p vuoto? io avevo messo anche un contrllo nel momento in cui il campo fosse vuoto...