分享一个辅助函数,使用php尽可能识别出字符串中的数字,
先上代码
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
52
|
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 );
}
//来自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 ;
}
|
实现效果如下。
1
2
3
4
5
6
7
8
9
10
|
echo checkNatInt( '九百六十万' ); //普通中文数字,9600000
echo checkNatInt( '壹亿柒仟万零捌佰肆拾' ); //大写中文数字,170000840
echo checkNatInt( '学好PHP拿百万年薪' ); //句子中的数字, 1000000
echo checkNatInt( '今年春运发送人次达26亿' ); //数字和汉字混合出现,2600000000
echo checkNatInt( '两只小蜜蜂' ); //口语化数字,2
echo checkNatInt( '万万没想到' ); //复古的表达方式,100000000
|
注意事项
不支持小数
不支持大于PHP_INT_MAX的数