preg_replace_callback passa alla funzione che tu specifichi (swap_smile) un array con i valori trovati dall'espressione regolare.
La tua funzione al momento si aspetta una stringa, devi modificarla affinché lavori sull'array che gli viene passato.
Ti consiglio di fare un print_r() dell'array passato dentro la funzione, in modo da capirne la struttura, per poi lavorarci con la tua funzione.