OK, allora io farei così.

I testi li filtrerei nel seguente modo:
Codice PHP:
// $str è una ipotetica variabile che contiene testi
// passati da una form
     
$str $_POST['str'];
// elimino eventuali spazi ad inizio e fine stringa
     
$str trim($str);
// eliminio eventuali slash messi da php (dipende 
// dalle impostazioni e dalla versione) 
    
$str stripslashes($str);
// recupero una lista di aratteri da sostituire
    
$caratteri get_html_translation_table(HTML_ENTITIESENT_QUOTES);
// sostituisco questi caratteri all'interno della mia stringa
    
$str strtr($str$caratteri);    
// faccio l'escape di tutti i caratteri "pericolosi" 
// prima della INSERT nel DB
    
$str mysql_real_escape_string($str); 
Ti ripeto, io la funzione nl2br() la userei solo in fase di output dei testi e solo per una migliore comprensibilità del testo in fase di layout.

Per i controlli sui numeri puoi usare la funzione is_numeric.

Codice PHP:
 $num $_POST['num'];

if (!
is_numeric($num)) {
// $num non è un numero
} else {
// $num è un numero

Con questi metodi ti garantisci un buon controllo sugli input, per quanto dovresti sempre implementare delle regexp se volessi fare dei controlli ancora migliori.

La questione degli apici è semplice: in un campo di input non filtrato, un apice potrebbe essere un buon metodo per veicolare un attacco di tipo SQL INJECTION (ad esempio).
Per essere sicuri che questo non vada in porto, basterebbe andare a fare l'escape degli apici, al fine di trasformarli in una stringa semplice e quindi renderli innocui.

Un ultima cosa: io ti ho scritto questi controlli in procedurale perché mi andava solo di mostrarti dei metodi di lavoro.
Mettere tutti questi controlli in funzioni sarà il tuo prossimo obiettivo, al fine di avere poco codice e completamente riciclabile.