分享一個輔助函數,使用php盡可能識別出字符串中的數字,實現效果如下。
1 2 3 4 5 6 7 8 9echo
checkNatInt(
'九百六十萬'
);
//普通中文數字,9600000
echo
checkNatInt(
'壹億柒仟萬零捌佰肆拾'
);
//大寫中文數字,170000840
echo
checkNatInt(
'學好PHP拿百萬年薪'
);
//句子中的數字, 1000000
echo
checkNatInt(
'今年春運發送人次達26億'
);
//數字和漢字混合出現,2600000000
echo
checkNatInt(
'兩只小蜜蜂'
);
//口語化數字,2
echo
checkNatInt(
'萬萬沒想到'
);
//復古的表達方式,100000000
注意事項
不支持小數
不支持大於PHP_INT_MAX的數
部分實現代碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52function
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
);
}
//來自uct php微信開發框架,其中的checkString函數如下
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
;
}