正则表达试是我们在开发验证时会常用到的一些规则,下面我整理了在我们用户数据提交时的一些常用的正则表达式,希望这些整理数据对你有帮助。
正则表达式一直以来是我比较头痛的东西,不过工作中是离不开正则表达式的,代码、vim编辑器、awk等Linux命令都广泛应用正则表达式。这是我收集并且测试过的PHP代码中常用的正则表达式,首先建立测试函数:
代码如下 |
复制代码 |
function regTest( $pattern, $str ) {
var_dump( preg_match($pattern, $str) );
preg_match_all($pattern,$str,$matches);
var_dump( $matches );
var_dump( preg_replace($pattern,$str,'Test') );
}
|
1. 匹配中文字符
代码如下 |
复制代码 |
$pattern = "/[x{4e00}-x{9fa5}]/u";
$str = "飞晏-feiyan";
regTest( $pattern, $str );
//依次输出结果
//int(1)
//array(1) { [0]=> array(2) { [0]=> string(3) "飞" [1]=> string(3) "晏" } }
//string(28) "TestTest-feiyan"
|
关于汉字的匹配,网上很多给的都是“[u4e00-u9fa5]”,这个正则不一定完全正确。
2. 匹配tab缩进、空格和换行
代码如下 |
复制代码 |
$pattern = "/[x{4e00}-x{9fa5}]/u";
$str = "飞晏-feiyan";
regTest( $pattern, $str );
//依次输出结果
//int(1)
//array(1) { [0]=> array(2) { [0]=> string(3) "飞" [1]=> string(3) "晏" } }
//string(28) "TestTest-feiyan"
//string(21) "HelloTestTest,TestPHP"
|
3. 匹配Email地址
代码如下 |
复制代码 |
$pattern = "[w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*]";
$str = '如有问题,请联系service@lenovo.com或者contact@ibm.com。';
regTest( $pattern, $str );
//依次输出结果
//int(1)
//array(4) { [0]=> array(2) { [0]=> string(18) "service@lenovo.com" [1]=> string(15) "contact@ibm.com" } [1]=> array(2) { [0]=> string(0) "" [1]=> string(0) "" } [2]=> array(2) { [0]=> string(0) "" [1]=> string(0) "" } [3]=> array(2) { [0]=> string(0) "" [1]=> string(0) "" } }
//string(41) "如有问题,请联系Test或者Test。"
|
//使用Filter函数
filter_var($email, FILTER_VALIDATE_EMAIL);
我一般不自己写正则表达式去验证邮箱,使用PHP内置filter函数可以很方便的完成邮箱地址的验证。
4. 匹配国内手机号码和电话号码
代码如下 |
复制代码 |
//固定电话匹配
$pattern = "[d{3,4}-d{7,8}]";
$str = '联系电话010-12345678';
regTest( $pattern, $str );
//最简单的匹配手机号匹配
$pattern = "[1d{10}]";
$str = '联系电话15812345678';
regTest( $pattern, $str ); |
5. 匹配HTML中的图片地址
代码如下 |
复制代码 |
$pattern = '/<[img|IMG].*?src=['|"](.*?(?:[.gif|.jpg]))['|"].*?[/]?>/';
$str = '<img id="test_img" src="images/123.gif" alt="test" />';
regTest( $pattern, $str );
/**
* 验证邮政编码
* @param string $value
* @param string $match
* @return boolean
*/
public static function isPostcode($value,$match='/d{6}/'){
$v = trim($value);
if(empty($v))
return false;
return preg_match($match,$v);
}
/**
* 验证IP
* @param string $value
* @param string $match
* @return boolean
*/
public static function isIP($value,$match='/^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]).(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$/'){
$v = trim($value);
if(empty($v))
return false;
return preg_match($match,$v);
}
/**
* 验证身份证号码
* @param string $value
* @param string $match
* @return boolean
*/
public static function isIDcard($value,$match='/^d{6}((1[89])|(2d))d{2}((0d)|(1[0-2]))((3[01])|([0-2]d))d{3}(d|X)$/i'){
$v = trim($value);
if(empty($v))
return false;
else if(strlen($v)>18)
return false;
return preg_match($match,$v);
}
/**
* *
* 验证URLwww.111cn.net
* @param string $value
* @param string $match
* @return boolean
*/
public static function isURL($value,$match='/^(http://)?(https://)?([wd-]+.)+[w-]+(/[dw-./?%&=]*)?$/'){
$v = strtolower(trim($value));
if(empty($v))
return false;
return preg_match($match,$v);
}
|
补充
表单验证匹配
验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-zA-Z0-9_]{4,15}$
验证账号,不能为空,不能有空格,只能是英文字母:^S+[a-z A-Z]$
验证账号,不能有空格,不能非数字:^d+$
验证用户密码,以字母开头,长度在 6-18 之间:^[a-zA-Z]w{5,17}$
验证是否含有 ^%&',;=?$ 等字符:[^%&',;=?$x22]+
匹配Email地址:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匹配腾讯QQ号:[1-9][0-9]{4,}
匹配日期,只能是 2004-10-22 格式:^d{4}-d{1,2}-d{1,2}$
匹配国内电话号码:^d{3}-d{8}|d{4}-d{7,8}$
评注:匹配形式如 010-12345678 或 0571-12345678 或 0831-1234567
匹配中国邮政编码:^[1-9]d{5}(?!d)$
匹配身份证:d{14}(d{4}|(d{3}[xX])|d{1})
评注:中国的身份证为 15 位或 18 位
不能为空且二十字节以上:^[s|S]{20,}$
文章先是给各位普及一下关于cookie与session的两个例子,然后再以利用cookie自动登录为例子给大家介绍了它们之间的关系及后面总结了区别,希望此文章对你理解cookie与session会有所帮助。
session的使用:
session_start();定义$_SESSION数组变量。
session_start()使用前,不能有任何形式的输出,包括php中的输出和html代码。
$_SESSION数组不可以使用数值下标,只可以使用字符串下标。
php.ini中的session_save_path配置项决定了session的保存位置。
默认情况下,session是保存在文件中。我们可以使用session_set_save_handler()函数来重写session机制。
设置有效时间
代码如下 |
复制代码 |
SESSION:
ini_set('session.gc_maxlifetime',24*3600);//session保存一天
session_start();
$_SESSION[‘web_name’]='网易';
|
说明:好像默认是时间是:20-24分钟,但是关闭浏览器session就自动消失了!
删除session:
删除某个元素 unset($_SESSION[key]);
删除所有session $_SESSION=array();
删除保存session数据的文件 session_destroy();
session_distroy()方法只是删除了服务器端的session文件,并不会释放内存中的$_SESSION变量,如果我们在session_distroy()后,立即var_dump($_SESSION),仍然可以看到session输出。因此如果想完全的释放session,必须配合使用$_SESSION=array()。
cookie的使用:
设置cookie:setcookie(变量名,变量值,生存时间(时间戳))。
删除cookie:setcookie(变量名,值,time()-1)。原理:设置cookie的生存时间过期。
读取cookie:$_COOKIE[变量名]。
$path="/"; //设置cookie存放的路径;1.默认存放是本目录,只有本目录下才能访问,2.“/”表示存放在根目录,3.“/foo/”只有foo文件夹下面文件才能访问
代码如下 |
复制代码 |
setcookie("cookiename","网易'", time()+intval(24*3600),$path); /* 有效期 1天 */
|
注意:cookie存放的值只能是string类型的,但是要存放数值怎么解决呢!
存储:
代码如下 |
复制代码 |
$array=array('a','b');
//"serialize:"返回值是一个字符串。有的时候为了把一些数据转为字符串存起来,但是希望保持数据原来有结构和内容。就要用到这个函数。
$res=serialize($array);
setcookie("snsresult",$res,time()+intval(24*3600));
|
读取:
代码如下 |
复制代码 |
//恢复serialize对象
$other = StripSlashes($_COOKIE['snsresult']);//必须执行这步
$arr=unserialize($other);//先将加密cookie进行解码 www.111Cn.net
|
注意:setcookie在代码中存取值时前面是不可以输出任何内容的,空行也不可以,不然cookie是没有值的。
1、$_COOKIE只可以读取cookie的值,并不能对cookie进行设置。
2、在使用setcookie之前,不能有任何类型的输出。
3、在脚本第一次设置cookie后,是不能在当前脚本使用$_COOKIE获取到的。需刷新页面或者在其他脚本中获取。
自动登录
代码如下 |
复制代码 |
//检查用户是否登录
function checklogin(){
if(empty($_SESSION['user_info'])){ //检查一下session是不是为空
if(empty($_COOKIE['username']) || empty($_COOKIE['password'])){ //如果session为空,并且用户没有选择记录登录状
header("location:login.php?req_url=".$_SERVER['REQUEST_URI']); //转到登录页面,记录请求的url,登录后跳转过去,用户体验好。
}else{ //用户选择了记住登录状态
$user = getUserInfo($_COOKIE['username'],$_COOKIE['password']); //去取用户的个人资料
if(empty($user)){ //用户名密码不对没到取到信息,www.111Cn.net 转到登录页面
header("location:login.php?req_url=".$_SERVER['REQUEST_URI']);
}else{
$_SESSION['user_info'] = $user; //用户名和密码对了,把用户的个人资料放到session里面
}
}
}
}
二,用户提交登录信息
username = trim($_POST['username']);
$password = md5(trim($_POST['password']));
$validatecode = $_POST['validateCode'];
$ref_url = $_GET['req_url'];
$remember = $_POST['remember'];
$err_msg = '';
if($validatecode!=$_SESSION['checksum']){
$err_msg = "验证码不正确";
}elseif($username=='' || $password==''){
$err_msg = "用户名和密码都不能为空";
}else{
$row = getUserInfo($username,$password);
if(empty($row)){
$err_msg = "用户名和密码都不正确";
}else{
$_SESSION['user_info'] = $row;
if(!empty($remember)){ //如果用户选择了,记录登录状态就把用户名和加了密的密码放到cookie里面
setcookie("username", $username, time()+3600*24*365);
setcookie("password", $password, time()+3600*24*365);
}
if(strpos($ref_url,"login.php") === false){
header("location:".$ref_url);
}else{
header("location:main_user.php");
}
}
}
三,当用户点退出时,清出记录登录状态
//退出登录
function logout(){
unset($_SESSION['user_info']);
if(!empty($_COOKIE['username']) || !empty($_COOKIE['password'])){
setcookie("username", null, time()-3600*24*365);
setcookie("password", null, time()-3600*24*365);
}
}
|
两者的联系与区别:
联系:
两者都被成为会话技术,用于解决http的无状态性。
sessionID是保存在cookie中的。默认情况下,session是依赖cookie的,如果浏览器端完全禁用了cookie,那么session也就不能用了。但是我们有其他的方法可以让session继续有用。比如url重写,将sessionID放在url中;给表单增加隐藏域,讲sessionID存放在隐藏域中,发送至浏览器。
区别:
cookie保存早浏览器端,每次访问服务器的时候,都会讲cookie带过去,保证让服务器知道两次请求来自于同一个客户端。安全性较低。
session保存在服务器,每次请求都会通过cookie带来的sessionID去服务器匹配。安全性较高。
session的有效期从session_start()开始,到浏览器关闭结束。
cookie可以设定有效期。默认为浏览器关闭cookie就失效,sessionID丢失,即使服务器端的session文件还在,也不会被找到。
目前最为流行的微信游戏了,就是抽奖活动,下面我看一站长整理了这款抽奖源码出来,下面我也转过来与各位朋友分享。
在做微信的过程中用到了微信抽奖,看了其他的作者都只是吧微信抽奖的页面共享出来了。我现在把转盘抽奖程序和微信抽奖页面都共享出来,有需要的自己把两者组合一下即可。
部份源码:配置文件
代码如下 |
复制代码 |
<?php
return array (
'DB_TYPE' => 'mysql',
'DB_HOST' => '127.0.0.1',
'DB_NAME' => 'ites',
'DB_USER' => 'root',
'DB_PWD' => '111111',
'DB_PORT' => 3306,
'DB_PREFIX' => 'it_',
'APP_DEBUG' => 1,
'SHOW_ERROR_MSG' => 1,
'SHOW_PAGE_TRACE' => 1,
'DATA_CACHE_TYPE' => 'Redis',
'REDIS_HOST' => '127.0.0.1',
'REDIS_PORT' => 6379,
'DATA_CACHE_TIME' => 3600,
'URL_CASE_INSENSITIVE' => true,
'TMPL_STRIP_SPACE' => false,
'URL_HTML_SUFFIX' => '',
'SITE_NAME' => '11111',
'SITE_URL' => 'http://www.111cn.net/',
'WECHAT_TOKEN' => '你的',
'WECHAT_APPID' => '你的',
'WECHAT_APPSECRET' => '你的',
'DATA_AUTH_KEY' => 'abcdddd',
);
?> |
commond.php文件
代码如下 |
复制代码 |
<?php
function isMobile($mobile) {
return preg_match("/^(?:13d|14d|15d|18[0123456789])-?d{5}(d{3}|*{3})$/", $mobile);
}
function isEmail($email) {
return strlen($email) > 6 && preg_match("/^[w-.]+@[w-.]+(.w+)+$/", $email);
}
/**
* 发送HTTP请求方法,目前只支持CURL发送请求
* @param string $url 请求URL
* @param array $params 请求参数
* @param string $method 请求方法GET/POST
* @return array $data 响应数据
*/
function http($url, $params, $method = 'GET', $header = array(), $multi = false){
$opts = array(
CURLOPT_TIMEOUT => 30,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_HTTPHEADER => $header
);
/* 根据请求类型设置特定参数 */
switch(strtoupper($method)){
case 'GET':
$opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
break;
case 'POST':
//判断是否传输文件
//$params = $multi ? $params : http_build_query($params);
$opts[CURLOPT_URL] = $url;
$opts[CURLOPT_POST] = 1;
$opts[CURLOPT_POSTFIELDS] = $params;
break;
default:
throw new Exception('不支持的请求方式!');
}
/* 初始化并执行curl请求 */
$ch = curl_init();
curl_setopt_array($ch, $opts);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if($error) throw new Exception('请求发生错误:' . $error);
return $data;
}
/**
* 不转义中文字符和/的 json 编码方法
* @param array $arr 待编码数组
* @return string
*/
function jsencode($arr) {
$str = str_replace ( "\/", "/", json_encode ( $arr ) );
$search = "#\u([0-9a-f]+)#ie";
if (strpos ( strtoupper(PHP_OS), 'WIN' ) === false) {
$replace = "iconv('UCS-2BE', 'UTF-8', pack('H4', '\1'))";//LINUX
} else {
$replace = "iconv('UCS-2', 'UTF-8', pack('H4', '\1'))";//WINDOWS
}
return preg_replace ( $search, $replace, $str );
}
// 数据保存到文件
function data2file($filename, $arr=''){
if(is_array($arr)){
$con = var_export($arr,true);
$con = "<?php return $con; ?>";
} else{
$con = $arr;
$con = "<?php $con; ?>";
}
write_file($filename, $con);
}
/**
* 系统加密方法
* @param string $data 要加密的字符串
* @param string $key 加密密钥
* @param int $expire 过期时间 单位 秒
* @return string
* @author winky
*/
function encrypt($data, $key = '', $expire = 0) {
$key = md5(empty($key) ? C('DATA_AUTH_KEY') : $key);
$data = base64_encode($data);
$x = 0;
$len = strlen($data);
$l = strlen($key);
$char = '';
for ($i = 0; $i < $len; $i++) {
if ($x == $l) $x = 0;
$char .= substr($key, $x, 1);
$x++;
}
$str = sprintf('%010d', $expire ? $expire + time():0);
for ($i = 0; $i < $len; $i++) {
$str .= chr(ord(substr($data, $i, 1)) + (ord(substr($char, $i, 1)))%256);
}
return str_replace(array('+','/','='),array('-','_',''),base64_encode($str));
}
/**
* 系统解密方法
* @param string $data 要解密的字符串 (必须是encrypt方法加密的字符串)
* @param string $key 加密密钥
* @return string
* @author winky
*/
function decrypt($data, $key = ''){
$key = md5(empty($key) ? C('DATA_AUTH_KEY') : $key);
$data = str_replace(array('-','_'),array('+','/'),$data);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
$data = base64_decode($data);
$expire = substr($data,0,10);
$data = substr($data,10);
if($expire > 0 && $expire < time()) {
return '';
}
$x = 0;
$len = strlen($data);
$l = strlen($key);
$char = $str = '';
for ($i = 0; $i < $len; $i++) {
if ($x == $l) $x = 0;
$char .= substr($key, $x, 1);
$x++;
}
for ($i = 0; $i < $len; $i++) {
if (ord(substr($data, $i, 1))<ord(substr($char, $i, 1))) {
$str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
}else{
$str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
}
}
return base64_decode($str);
}
function getTaskStatusStr($status = 0,$type = 'apply' , $company = ''){
if ($type == 'comment') return '尚未作出评价';
switch ($status) {
case 0:
return $type == 'apply' ? '已发出任务申请' : $company.'对你发出了任务邀请';
break;
case 1:
return $type == 'apply' ? '企业已通过申请' : '已同意企业的邀请';
break;
case 2:
return $type == 'apply' ? '企业已忽略你的申请' : '你已经忽略企业的邀请';
break;
case 3:
return $type == 'apply' ? '你已完成该任务' : '该任务已经完成';
break;
default:
return '未知的状态';
break;
}
}
function getArea($cache = true){
$area = S ( 'S_Area' );
if (empty ( $area ) || ! $cache) {
// 缓存不存在,或者参数读取缓存。
$areaModel = D('Area');
$area = $areaModel -> where ('status = 3')->order ( 'sort,itemid' )->getField('itemid,title,pid,arrparentid,child');
//把市的省拚出来
foreach ($area as $k=>$v){
//如果是顶级
if ($v['pid']==0){
$areaArr[$v['itemid']]['itemid'] = $v['itemid'];
$areaArr[$v['itemid']]['title'] = $v['title'];
$areaArr[$v['itemid']]['pid'] = $v['pid'];
$areaArr[$v['itemid']]['arrparentid'] = $v['arrparentid'];
$areaArr[$v['itemid']]['child'] = $v['child'];
//上级
$areaArr[$v['itemid']]['upitemid'] = $v['itemid'];
$areaArr[$v['itemid']]['uptitle'] = $v['title'];
}
//查出上级的名称和ID
else {
$areaArr[$v['itemid']]['itemid'] = $v['itemid'];
$areaArr[$v['itemid']]['title'] = $v['title'];
$areaArr[$v['itemid']]['pid'] = $v['pid'];
$areaArr[$v['itemid']]['arrparentid'] = $v['arrparentid'];
$areaArr[$v['itemid']]['child'] = $v['child'];
//上级
$areaArr[$v['itemid']]['upitemid'] = $area[$v['pid']]['itemid'];
$areaArr[$v['itemid']]['uptitle'] = $area[$v['pid']]['title'];
}
}
$area = $areaArr;
S ( 'S_Area' , $area );
}
return $area;
}
?>
|
源码下载地址
http://file.111cn.net/upload/2014/3/wx.rar
主要分享php中手机号、座机、邮箱、身份证(15或18位)、手机号截取(中间四位为*)的正则表达式,都是自己工作收集而来。如果有不对的地方。欢迎提出!
代码如下 |
复制代码 |
//验证手机号
$match = '/^((13[0-9])|(15[^4,\d])|(18[0,5-9]))[0-9]{8}$/';
//验证座机
$match = '/^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})+(-[0-9]{1,4})?$/';
//验证身份证号15或18位
$match = '/(^d{15}$)|(^d{17}(d|X|x)$)/';
//Email验证
$match = '/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/';
//将手机号中间转换为 * 号
$tel = 18600000000;
$pattern = '/(d{3})d{4}(d{3})/';
$replacement = "$1****$2";
echo preg_replace($pattern,$replacement,$tel);
|
我们常用做商城时会希望把用户输入的数字转换在RMB大写形式了,下面我整理了几个可以处理万亿级的数字转换例子,大家一起来看看这些例子吧。
例子1
代码如下 |
复制代码 |
function change_num($num)
{
$d = array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
$e = array('元','拾','佰','仟','万','拾万','佰万','仟万','亿','拾亿','佰亿','仟亿','万亿');
$p = array('分','角');
$zheng='整'; //追加"整"字
$final = array(); //结果
$inwan=0; //是否有万
$inyi=0; //是否有亿
$len_pointdigit=0; //小数点后长度
$y=0;
if($c = strpos($num, '.')) //有小数点,$c为小数点前有几位数
{
$len_pointdigit = strlen($num)-strpos($num, '.')-1; // 判断小数点后有几位数
if($c>13) //简单的错误处理
{
echo "数额太大,已经超出万亿.";
die();
}
elseif($len_pointdigit>2) //$len_pointdigit小数点后有几位
{
echo "小数点后只支持2位.";
die();
}
}
else //无小数点
{
$c = strlen($num);
$zheng = '整';
}
for($i=0;$i<$c;$i++) //处理整数部分
{
$bit_num = substr($num, $i, 1); //逐字读取 左->右
if($bit_num!=0 || substr($num, $i+1, 1)!=0) //当前是零 下一位还是零的话 就不显示
@$low2chinses = $low2chinses.$d[$bit_num];
if($bit_num || $i==$c-1)
@$low2chinses = $low2chinses.$e[$c-$i-1];
}
for($j=$len_pointdigit; $j>=1; $j--) //处理小数部分
{
$point_num = substr($num, strlen($num)-$j, 1); //逐字读取 左->右
if($point_num != 0)
@$low2chinses = $low2chinses.$d[$point_num].$p[$j-1];
//if(substr($num, strlen($num)-2, 1)==0 && substr($num, strlen($num)-1, 1)==0) //小数点后两位都是0
}
$chinses = str_split($low2chinses,2); //字符串转换成数组
//print_r($chinses);
for($x=sizeof($chinses)-1;$x>=0;$x--) //过滤无效的信息
{
if($inwan==0&&$chinses[$x]==$e[4]) //过滤重复的"万"
{
$final[$y++] = $chinses[$x];
$inwan=1;
}
if($inyi==0&&$chinses[$x]==$e[8]) //过滤重复的"亿"
{
$final[$y++] = $chinses[$x];
$inyi=1;
$inwan=0;
}
if($chinses[$x]!=$e[4]&&$chinses[$x]!=$e[8]) //进行整理,将最后的值赋予$final数组
$final[$y++] = $chinses[$x];
}
$newstring=(array_reverse($final)); //$final为倒数组,$newstring为正常可以使用的数组
$nstring=join($newstring); //数组变成字符串
if(substr($num,-2,1)==0 && substr($num,-1)<>0) //判断原金额角位为0 ? 分位不为0 ?
{
$nstring=substr($nstring,0,(strlen($nstring)-4))."零".substr($nstring,-4,4); //这样加一个零字
}
$fen="分";
$fj=substr_count($nstring, $fen); //如果没有查到分这个字
return $nstring=($fj==0)?$nstring.$zheng:$nstring; //就将"整"加到后面
}
|
例子2
1.支持天文数字,整数位理论上可以无限的长;
2.支持小数,对于货币,一般精确到小数后两位,可以设置小数位是否四舍五入;
3.支持自定义货币单位,有的系统要求大写是"圆",有的要求是"元",可以自定义;
4.支持整数以0结束并含有小数的数字自定义末尾补"零",比如有的系统要求1960.30这样的数字转大写之后是"壹仟玖佰陆拾元叁角",而有的系统则要求"壹仟玖佰陆拾元零叁角",这两种情况按"正确填写票据和结算凭证的基本规定"都是正确的,现在可已自定义。
代码如下 |
复制代码 |
<?php
/**
* 人民币小写转大写
*
* @param string $number 数值
* @param string $int_unit 币种单位,默认"元",有的需求可能为"圆"
* @param bool $is_round 是否对小数进行四舍五入
* @param bool $is_extra_zero 是否对整数部分以0结尾,小数存在的数字附加0,比如1960.30,
* 有的系统要求输出"壹仟玖佰陆拾元零叁角",实际上"壹仟玖佰陆拾元叁角"也是对的
* @return string
* @site www.111cn.net */
function num2rmb($number = 0, $int_unit = '元', $is_round = TRUE, $is_extra_zero = FALSE)
{
// 将数字切分成两段
$parts = <A class=infotextkey href="http://www." target=_blank>explode</A>('.', $number, 2);
$int = <A class=infotextkey href="http://www.111cn.net/" target=_blank>isset</A>($parts[0]) ? strval($parts[0]) : '0';
$dec = isset($parts[1]) ? strval($parts[1]) : '';
// 如果小数点后多于2位,不四舍五入就直接截,否则就处理
$dec_len = strlen($dec);
if (isset($parts[1]) && $dec_len > 2)
{
$dec = $is_round
? substr(strrchr(strval(round(floatval("0.".$dec), 2)), '.'), 1)
: substr($parts[1], 0, 2);
}
// 当number为0.001时,小数点后的金额为0元
if(empty($int) && empty($dec))
{
return '零';
}
// 定义
$chs = array('0','壹','贰','叁','肆','伍','陆','柒','捌','玖');
$uni = array('','拾','佰','仟');
$dec_uni = array('角', '分');
$exp = array('', '万');
$res = '';
// 整数部分从右向左找
for($i = strlen($int) - 1, $k = 0; $i >= 0; $k++)
{
$str = '';
// 按照中文读写习惯,每4个字为一段进行转化,i一直在减
for($j = 0; $j < 4 && $i >= 0; $j++, $i--)
{
$u = $int{$i} > 0 ? $uni[$j] : ''; // 非0的数字后面添加单位
$str = $chs[$int{$i}] . $u . $str;
}
//echo $str."|".($k - 2)."<br>";
$str = rtrim($str, '0');// 去掉末尾的0
$str = preg_replace("/0+/", "零", $str); // 替换多个连续的0
if(!isset($exp[$k]))
{
$exp[$k] = $exp[$k - 2] . '亿'; // 构建单位
}
$u2 = $str != '' ? $exp[$k] : '';
$res = $str . $u2 . $res;
}
// 如果小数部分处理完之后是00,需要处理下
$dec = rtrim($dec, '0');
// 小数部分从左向右找
if(!empty($dec))
{
$res .= $int_unit;
// 是否要在整数部分以0结尾的数字后附加0,有的系统有这要求
if ($is_extra_zero)
{
if (substr($int, -1) === '0')
{
$res.= '零';
}
}
for($i = 0, $cnt = strlen($dec); $i < $cnt; $i++)
{
$u = $dec{$i} > 0 ? $dec_uni[$i] : ''; // 非0的数字后面添加单位
$res .= $chs[$dec{$i}] . $u;
}
$res = rtrim($res, '0');// 去掉末尾的0
$res = preg_replace("/0+/", "零", $res); // 替换多个连续的0
}
else
{
$res .= $int_unit . '整';
}
return $res;
}
echo "<pre>";
$number = "1000000000000000012345678900.501";
echo $number.":".num2rmb($number);
echo "n";
$number = "1960.30";
echo $number.":".num2rmb($number);
echo "n";
$number = "1960.30";
echo $number.":".num2rmb($number, "圆", true, true);
echo "n";
$number = "123456789.005";
echo $number.":".num2rmb($number);
echo "n";
$number = "123456789.005";
echo $number.":".num2rmb($number, "元", false);
echo "n";
$number = "10000000000000000060009.101";
echo $number.":".num2rmb($number);
echo "n";
$number = "1680.32";
echo $number.":".num2rmb($number);
?>
|
例子3
看上面的个人更喜欢下面这个
代码如下 |
复制代码 |
//把数字金额转换成中文大写数字的函数
function num2rmb ($num){
$c1="零壹贰叁肆伍陆柒捌玖";
$c2="分角元拾佰仟万拾佰仟亿";
$num=round($num,2);
$num=$num*100;
$NewNum = ceil($num);
if(strlen($NewNum)>10){
return "金额太大";
}
$i=0;
$c="";
while (1){
if($i==0){
$n=substr($num,strlen($num)-1,1);
}else{
$n=$num %10;
}
$p1=substr($c1,2*$n,2);
$p2=substr($c2,2*$i,2);
if($n!='0' || ($n=='0' &&($p2=='亿' || $p2=='万' || $p2=='元' ))){
$c=$p1.$p2.$c;
}else{
$c=$p1.$c;
}
$i=$i+1;
$num=$num/10;
$num=(int)$num;
if($num==0){
break;
}
}//end of while| here, we got a chinese string with some useless character
//we chop out the useless characters to form the correct output
$j = 0;
$slen=strlen($c);
while ($j< $slen) {
$m = substr($c,$j,4);
if ($m=='零元' || $m=='零万' || $m=='零亿' || $m=='零零'){
$left=substr($c,0,$j);
$right=substr($c,$j+2);
$c = $left.$right;
$j = $j-2;
$slen = $slen-2;
}
$j=$j+2;
}
if(substr($c,strlen($c)-2,2)=='零'){
$c=substr($c,0,strlen($c)-2);
} // if there is a '0' on the end , chop it out
return $c;
}// end of function
|