echo $rpl = preg_replace('/[^a-zA-Z0-9_-](?![a-zA-Z0-9_]*?$)/','_',$string);

oppure


echo $rpl = preg_replace('/(?i)[^a-z0-9_-](?![a-z0-9_]*?$)/','_',$string);