Zawsze możesz otworzyć plik i czytać znak po znaku. Otwierasz również uchwyt do pliku tymczasowego - w pętli sprawdzasz znak, jeśli zabroniony, to skaczesz dalej, jeśli nie - zapisujesz.
Możesz jeszcze czytać paczkami po np. 64 bajty i przez funkcję zamieniającą to traktować; nie robiłem benchmarku, więc trudno mi powiedzieć, co będzie szybsze.
Ale na pewno wykorzystywanie wyrażeń regularnych do podmiany z góry ustalonego ciągu znaków, to pomyłka. Sprawdź
str_replace.