正規表現の場合、機種依存文字を事前にリストアップして、配列などにしておく必要がありそうです。
文字列を1文字ずつ配列にして、チェックして変換するというやや面倒な感じになりますが以下のコードで実現できそうです。動作は、UTF8で確認しています。
php
1function replaceDependentChar($str) {
2 #文字列を配列に変換
3 # (1)を参照
4 $str_array = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
5 $result = "";
6 foreach ($str_array as $letter) {
7 #機種依存文字か判定
8 # (2)を参照
9 if( strlen($letter) !== strlen(mb_convert_encoding(mb_convert_encoding($letter,'SJIS','UTF-8'),'UTF-8','SJIS'))) {
10 $letter = "?";
11 }
12 $result .= $letter;
13 }
14 return $result;
15}
16
17var_dump(replaceDependentChar("file㈱♡ファイル"));
18# 結果: string(18) "file??ファイル"
(1) http://thr3a.hatenablog.com/entry/20131027/1382849078
(2) https://gist.github.com/mgng/2090375