El problema es que str_replace está usando, para el reemplazo n, la salida del reemplazo n-1.La cadena
sobre la que se reemplaza [e|é] no es la misma que la que se usa al reemplazar [a|á]
Código PHP:
Ver original
switch($match[0])
{
case "a":
case "á":{
return "[a|á]";
}break;
}
},"palabra");
Hay que añadir el resto de los cases del switch.