メモ > 技術 > プログラミング言語: 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