何だこの文字は!?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)