質問: phpで特定の条件でファイルをリネームしたい。 環境はwindows xamppです。 ファイル名に英語(アルファベット)、数値、日本語(ひらがな、かな、カタカナ)以外の 文字があれば、「?」に置換するにはどうしたらよいでしょうか 文字化けや機種依存文字、中国語等の外国語をファイル名から除外するのが 目的です。 置換はこれでできるのはわかったんですが http://php.net/manual/ja/function.rename.php 正規表現がよくわからないです。 文字化けや機種依存文字を除外するといった 事で用途があり、サンプルがないかなとあさってみましたが 見当たりませんでした。
回答: 正規表現の場合、機種依存文字を事前にリストアップして、配列などにしておく必要がありそうです。 文字列を1文字ずつ配列にして、チェックして変換するというやや面倒な感じになりますが以下のコードで実現できそうです。動作は、UTF8で確認しています。 ``` function replaceDependentChar($str) { #文字列を配列に変換 # (1)を参照 $str_array = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY); $result = ""; foreach ($str_array as $letter) { #機種依存文字か判定 # (2)を参照 if( strlen($letter) !== strlen(mb_convert_encoding(mb_convert_encoding($letter,'SJIS','UTF-8'),'UTF-8','SJIS'))) { $letter = "?"; } $result .= $letter; } return $result; } var_dump(replaceDependentChar("file(株)♡ファイル")); # 結果: string(18) "file??ファイル" ``` (1) http://thr3a.hatenablog.com/entry/20131027/1382849078 (2) https://gist.github.com/mgng/2090375