Memo

メモ > 技術 > プログラミング言語: PHP > 外字や機種依存文字の判定

■外字や機種依存文字の判定
/** * JISの半角および、第1、2水準文字であることのチェック。 * @param $data 検査する文字列 * @return true:OK、false:NG * @see 外字や機種依存文字を弾く。第4水準文字は通るが、UTF-8で扱うと問題なくDBでも格納できるのでスルーとしている */ function validator_jis_1or2($data) { $rtn = ''; for ($idx = 0; $idx < mb_strlen($data, 'utf-8'); $idx++) { $str0 = mb_substr($data, $idx, 1, 'utf-8'); // 1文字をSJISにする。 $str = mb_convert_encoding($str0, 'sjis-win', 'utf-8'); //if (strlen($str) == 1) { // 1バイト文字 if ((strlen(bin2hex($str)) / 2) == 1) { // 1バイト文字 $c = ord($str{0}); } else { $c = ord($str{0}); // 先頭1バイト $c2 = ord($str{1}); // 2バイト目 $c3 = $c * 0x100 + $c2; // 2バイト分の数値にする。 if ((($c3 >= 0x8140) && ($c3 <= 0x853D)) || // 2バイト文字 (($c3 >= 0x889F) && ($c3 <= 0x988F)) || // 第一水準 (($c3 >= 0x9890) && ($c3 <= 0x9FFF)) || // 第二水準 (($c3 >= 0xE040) && ($c3 <= 0xEAFF))) { // 第二水準 } else { $rtn .= $str0; } } } if ($rtn != '') { return false; } else { return true; } } /** * 機種依存文字であることのチェック。 * @param $data 検査する文字列 * @return true:OK、false:NG * @see 特定機種依存文字を弾く。(??などの)旧漢字は通る。第一第二水準などの範囲で絞らない場合に使用。 */ function validator_machine_department($data) { $pdc = '?????????????????????????????????????????????????????????????????????????@?A?B?C?D?E?F?G?H?I¬?U?V?W'; $pdc_array = Array(); $pdc_text = str_replace(array("\r\n","\n","\r"), '', $data); while ($iLen = mb_strlen($pdc, 'UTF-8')) { array_push($pdc_array, mb_substr($pdc, 0, 1, 'UTF-8')); $pdc = mb_substr($pdc, 1, $iLen, 'UTF-8'); } foreach($pdc_array as $value) { if (preg_match('/(' . $value . ')/', $pdc_text)) { return false; break; } } return true; }

Advertisement