Как мне разрешить тире в этом шаблоне?
$str = preg_replace ( "/[^a-z \d]/i", "", $str ) ;
Поставь первым.
$str = preg_replace ( "/[^-a-z \d]/i", "", $str ) ;