4
4

More than 5 years have passed since last update.

制御文字がDBに入らないようにする

Last updated at Posted at 2017-04-28

キャプチャ.PNG
何だこの文字は!?ECサイト構築のお手伝い中こんな文字がDBに入ってしまうという問題にぶち当たりました。
BS・BEL・EM?どうやって入力されたんだろうw
どうやらこれASCII制御文字というらしい。
多分、バイナリエディタとか特殊なエディタで作成した文字をコピペでフォームに貼り付けることで発生するのでは?
(僕は、Sublime Textで文字コードをHexadecimalで08とか入れて、UTF8に変換して再現しました。)
完璧な原因は分かってないけど、多分そんな感じなんだろう・・・。
ということで、こんな関数を作ってバリデーション時に制御文字を削除する対応を入れました。

// PHP
function deleteHexadecimalString($str) {
    $result = "";
    $exclusions = ["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","7f"];
    for ($i=0; $i<mb_strlen($str); $i++) {
        $t = mb_substr($str, $i, 1, "UTF-8");
        if (!in_array(bin2hex($t), $exclusions)) {
            $result .= $t;
        }
    }
    return $result;
}

この問題、色んなサービスで頻発してそうだけど情報が探し方が悪いのか見当たらず・・・何方かもっといい方法あれば教えてくださーいm(_ _)m

教えてもらった通り正規表現使ったら簡単にできたのでこっちがおすすめです!

preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $text)
4
4
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4