Recortar caracteres duplicados consecutivos

Así que estoy creando URL para mis páginas haciendo lo siguiente:

$uri = strtolower($info->name); $uri = str_replace('&','and',$uri); $uri = $info->id."-".preg_replace('/[^a-zA-Z0-9]/','-',$uri); 

Básicamente hago todo en minúscula, cambio & ayy cambio todos los caracteres especiales a - . Mi único problema ahora si, por ejemplo, $info->name es this is - a string se mostrará como this-is---a-string .

Me gustaría que esto se convierta en this-is-a-string sin hacer algo como str_replace('---','-',$input);

Me imagino que necesito una expresión regular para esto, pero soy horrible con eso, así que me preguntaba si alguien puede ayudarme.

Cambio

 $uri = $info->id."-".preg_replace('/[^a-zA-Z0-9]/','-',$uri); 

a

 $uri = $info->id."-".preg_replace('/[^a-zA-Z0-9]+/','-',$uri);