Prima di tutto perche' mai usi l'operatore XOR? La logica di quel controllo chiede un AND: se non e' verificata la prima condizione E non e' verificata nemmeno la seconda allora stampa errore. Puoi usare XOR se inverti i controlli (togli i not prima dei preg_match) ma non ha comunque senso usarlo invece di OR.
Poi le tue espressioni contengono un sacco di roba inutile: intanto nessuna delle parentesi che hai messo serve a qualcosa. Poi "\.{1}" e' la stessa cosa che scrivere semplicemente "\.". Infine il tutto si puo' racchiudere in una sola espressione:
codice:
if (!preg_match('#^http://www(?:\.[a-z0-9-]+){1,2}\.[a-z]{2,4}$#i', $prova)) {
echo ("Errore");
} else {
echo ("Ok");
}