echo checkNatInt('九百六十萬'); // 9600000
echo checkNatInt('壹億柒仟萬零捌佰肆拾'); // 170000840
echo checkNatInt('學好PHP拿百萬年薪'); // 1000000
echo checkNatInt('今年春運發送人次達26億'); // 2600000000
echo checkNatInt('兩只小蜜蜂'); // 2
echo checkNatInt('萬萬沒想到'); // 100000000
PHP_INT_MAX 的數值<?php
// 校驗整數,失敗返回 $default
function checkInt($var, $default = 0) {
return is_numeric($var) ? intval($var, (strncasecmp($var, '0x', 2) == 0 || strncasecmp($var, '-0x', 3) == 0) ? 16 : 10) : $default;
}
// 校驗字串,$check 為正則表達式
function checkString($var, $check = '', $default = '') {
if (!is_string($var)) {
if (is_numeric($var)) { $var = (string)$var; }
else { return $default; }
}
if ($check) {
return (preg_match($check, $var, $ret) ? $ret[1] : $default);
}
return $var;
}
/**
* 校驗 KV JSON 格式
* 期望數據結構:{id:1, 'type':'single_text', 'required':true, 'desc':'this is a text'}
* $desc 範例:
* array(
* array('id', 'Int'),
* array('type', 'string', PATTERN_NORMAL_STRING),
* array('required', 'Bool', false),
* array('desc', 'string', PATTERN_NORMAL_STRING),
* )
*/
function checkKvJson($var, $desc = array()) {
if (is_string($var)) { $var = json_decode($var, true); }
if (!$var || !is_array($var)) { return array(); }
if ($desc) foreach ($desc as $d) {
if (!isset($var[$d[0]])) { return array(); }
$ps = array_slice($d, 2);
array_unshift($ps, $var[$d[0]]);
$var[$d[0]] = call_user_func_array('check'.$d[1], $ps);
if ($var[$d[0]] === false && strcasecmp($d[1], 'Bool')) { return array(); }
}
return $var;
}
// 主函數:中文轉數字
function checkNatInt($str) {
$map = array(
'一'=>'1','二'=>'2','三'=>'3','四'=>'4','五'=>'5','六'=>'6','七'=>'7','八'=>'8','九'=>'9',
'壹'=>'1','貳'=>'2','三'=>'3','肆'=>'4','伍'=>'5','陸'=>'6','柒'=>'7','捌'=>'8','玖'=>'9',
'零'=>'0','兩'=>'2',
'仟'=>'千','佰'=>'百','拾'=>'十',
'萬萬'=>'億',
);
$str = str_replace(array_keys($map), array_values($map), $str);
$str = checkString($str, '/([\d億萬千百十]+)/u');
$func_c2i = function ($str, $plus = false) use (&$func_c2i) {
if (false === $plus) {
$plus = array('億'=>100000000,'萬'=>10000,'千'=>1000,'百'=>100,'十'=>10);
}
$i = 0;
if ($plus) foreach ($plus as $k => $v) {
$i++;
if (strpos($str, $k) !== false) {
$ex = explode($k, $str, 2);
$new_plus = array_slice($plus, $i, null, true);
$l = $func_c2i($ex[0], $new_plus);
$r = $func_c2i($ex[1], $new_plus);
if ($l == 0) $l = 1; // 處理「十萬」省略一的情況
return $l * $v + $r;
}
}
return (int)$str;
};
return $func_c2i($str);
}
按單位從大到小(億→萬→千→百→十)遞歸拆解:
checkKvJson() 實現聲明式數據驗證:定義 schema 自動映射驗證函數check* 函數族支援鏈式調用代碼來源:UCT PHP 微信開發框架,結構清晰、邏輯嚴密,是 PHP 中文數字處理的優秀參考實現。