<?php
function checkNatInt(string $str): int {
// 1. 字元對照表(含大寫、口語、異體字)
$map = [
'一'=>'1','二'=>'2','三'=>'3','四'=>'4','五'=>'5','六'=>'6','七'=>'7','八'=>'8','九'=>'9',
'壹'=>'1','貳'=>'2','參'=>'3','肆'=>'4','伍'=>'5','陸'=>'6','柒'=>'7','捌'=>'8','玖'=>'9',
'零'=>'0','兩'=>'2',
'仟'=>'千','佰'=>'百','拾'=>'十',
'萬萬'=>'億', // 古語:萬萬 = 億
];
$str = strtr($str, $map);
// 2. 擷取連續「數字+單位」片段(含阿拉伯數字)
if (!preg_match('/([\d億萬千百十]+)/u', $str, $m)) return 0;
$segment = $m[1];
// 3. 遞迴解析:從大單位到小單位拆分
$units = ['億'=>100000000, '萬'=>10000, '千'=>1000, '百'=>100, '十'=>10];
$parse = function($s) use ($units, &$parse) {
foreach ($units as $unit => $value) {
if (strpos($s, $unit) !== false) {
[$left, $right] = explode($unit, $s, 2);
$left = $left === '' ? 1 : $parse($left); // 「十萬」左邊空 = 1
$right = $right === '' ? 0 : $parse($right);
return $left * $value + $right;
}
}
return (int)$s; // 純數字
};
return $parse($segment);
}
// 輔助:從任意字串擷取第一段數字片段
function checkString($var, $pattern='', $default='') {
if (!is_string($var)) $var = is_numeric($var) ? (string)$var : $default;
return $pattern ? (preg_match($pattern, $var, $m) ? $m[1] : $default) : $var;
}
?>
<?php
echo checkNatInt('九百六十萬') . "\n"; // 9600000
echo checkNatInt('壹億柒仟萬零捌佰肆拾') . "\n"; // 170000840
echo checkNatInt('學好PHP拿百萬年薪') . "\n"; // 1000000
echo checkNatInt('今年春運發送人次達26億') . "\n"; // 2600000000
echo checkNatInt('兩只小蜜蜂') . "\n"; // 2
echo checkNatInt('萬萬沒想到') . "\n"; // 100000000
?>
strtr 一次性替換所有中文數字字元為阿拉伯數字或標準單位字/([\d億萬千百十]+)/u 取出第一個連續「數字+單位」區塊explode 分割左右,左遞迴 × 單位值 + 右遞迴preg_match_all 取出所有數字片段回傳陣列PHP_INT_MAX(64位約 9.22e18)的數值這個 checkNatInt 函數以 30 行核心程式碼解決中文數字識別的 90% 場景,採用「字元正規化 → 正則擷取 → 遞迴下降解析」三階段管線,邏輯清晰、易於擴充。適合:中文金額錄入、語音轉文字後處理、爬蟲提取中文統計數字、表單驗證預處理等場景。