Как насчет регулярного выражения?
$output = preg_replace('#[^a-zA-Z_]#', '', $input);
Это заменяет все, что соответствует выражению, пустой строкой.
[] - это группа символов, символ ^ в начале группы означает: эта группа содержит каждый символ, который НЕ упоминается впоследствии. Таким образом, он содержит все, что не является a-z, A-Z или подчеркиванием.