Es mas facil con regexp:
Código PHP:
$texto = 'Mi libro Háal no dwadqwon ^*^%^@#$%$!@ daon aáóúñÑdé';
echo trim(strtolower(preg_replace('/([^a-z0-9]+)/i', '-', $texto)), "-");
//imprime: mi-libro-h-al-no-dwadqwon-daon-a-d-
El patron dice, reemplaza todo lo que no sea a-z ni 0-9 por "-". El trim, elimina los "-" que queden al principio y final de la cadena.