Yo uso para lo mismo una función que me hice y hasta ahora no he tenido problemas.
En base a ella quizá puedas/quieras construir una más potente para que se adapte a tus necesidades.
Funciona así: Tú le das una cadena y te la regresa "limpia".
Código PHP:
//
function make_url($cadena)
{
$cadenalimpia1 = strtolower(strtr($cadena, "áéíóúñÁÉÍÓÚÑ ", "aeiounaeioun-"));
$cadenalimpia2 = "";
for($i=0;$i<strlen($cadenalimpia1);$i++)
if(ereg("[a-z0-9-]",$cadenalimpia1[$i])) $cadenalimpia2.=$cadenalimpia1[$i];
return $cadenalimpia2;
}//end function