let filter_alphanumeric s assoc default =
let is_alphanum c =
String.contains "abcdefghijklmnopqrstuvwxyz" c
|| String.contains "ABCDEFGHIJKLMNOPQRSTUVWXYZ" c
|| String.contains "123456789" c
|| c = '_'
in
let alphanum_or_default c =
if is_alphanum c then c
else try List.assoc c assoc with Not_found -> default
in
string_implode (List.map alphanum_or_default (string_explode s))