Функция preg_replace не изменяет строку на месте. Он возвращает новую строку с результатом замены. Вы должны назначить результат обращения к переменной $id:
$id = preg_replace('/\s+/', '_', $id);
Ответ 2
Я думаю, что str_replace() может быть более уместным: