Почему не работает preg_replace в другой версии PHP?
<?php
$str = '12$34%56';
var_dump(preg_replace('~[^-a-z0-9_]+~u', '-', $str));
// 7.1.0: string(8) "12-34-56"
// 7.2.4: string(8) "12-34-56"
// 7.3.5: string(8) "12-34-56"
// 7.4.7: string(8) "12-34-56"
Где-то не там копаете, не в версии PHP дело.
А не смотрел что на ходится в $str перед вызовом регулярки?