No debería darte problemas el &, pues siempre que esté entre comillas php no intenta entenderlo, solo lo pasa de un logar a otro, tu problema debería resolverse con el charset, como dice R4s3c
Cita: <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
Pero como sea puede hacerlo así:
Código PHP:
$texto = $_POST[texto]; //... o de donde lo obtengas
$a = "á";
$texto= str_replace($a, "á", $texto);
... y luego para la é, la í, etc.
puedes usar arrays y cosas para escribir menos código, pero básicamente así te funciona.