PHP校验ISBN码的函数代码


Posted in PHP onJanuary 17, 2011

详细资料可以参考:国际标准书号 ? 维基百科,下面还是简述一下什么是ISBN码:
国际标准书号(International Standard Book Number,ISBN;拟发音is-ben),是国际通用的图书或独立的出版物(除定期出版的期刊)代码。出版社可以通过国际标准书号清晰的辨认所有非期刊书籍。一个国际标准书号只有一个或一份相应的出版物与之对应。新版本如果在原来旧版的基础上没有内容上太大的变动,在出版时也不会得到新的国际标准书号码。当平装本改为精装本出版时,原来相应的国际标准书号号码也应当收回。
平常我们能够见到的ISBN码有10位和13位两种,其中10位的ISBN自2007年1月起已经停止使用,目前新出版的图书ISBN码都是13位。考虑到一个严谨的图书管理程序要考虑到多方面的问题,因为10位ISBN码的图书还是有巨大的存世量的,所以要校验图书ISBN码的正确性,就必须同时考虑10位和13位的情况。从维基百科可以了解到ISBN码最后一位是校验码,其实要想校验ISBN码的正确,就是通过计算ISBN的校验码,看是否与最后一位吻合。这里所说的校验也只是校验ISBN在构成上是否合法,而不会校验是否为已发行图书的ISBN。下面是维基百科提供的ISBN码校验算法:
校验码的计算方法(10码)
假设某国际标准书号号码前9位是:7-309-04547
计算加权和S:S = 7×10+3×9+0×8+9×7+0×6+4×5+5×4+4×3+7×2 = 226
计算S÷11的余数M:M = 226 mod 11 = 6
计算11 ? M 的差N:N = 11 ? 6 = 5
如果N = 10,校验码是字母"X"
如果N = 11,校验码是数字"0"
如果N为其他数字,校验码是数字N
所以,本书的校验码是5;如果用户提供的ISBN码是7-309-04547-6,那么校验失败
校验码的计算方法(13码)
假设某国际标准书号号码前12位是:978-986-181-728
计算加权和S:S = (9×1)+(7×3)+(8×1)+(9×3)+(8×1)+(6×3)+(1×1)+(8×3)+(1×1)+(7×3)+(2×1)+(8×3) = 164
计算S÷10的余数M:M = 164 mod 10 = 4
计算10 ? M 的差N:N = 10 ? 4 = 6
如果N = 10,校验码是数字"0"
如果N为其他数字,校验码是数字N
所以,本书的校验码是6。完整的国际标准书号号码为 ISBN 978-986-181-728-6
好了,背景知识介绍到这,下面我写的ISBN码校验函数(php版),需要的话可以直接使用:

function isbn_sum($isbn, $len) 
{ 
/* 
* 该函数用于计算ISBN加权和 
* 参数说明: 
* $isbn : isbn码 
* $len : isbn码长度 
*/ 
$sum = 0; 
if ($len == 10) 
{ 
for ($i = 0; $i < $len-1; $i++) 
{ 
$sum = $sum + (int)$isbn[$i] * ($len - $i); 
} 
} 
elseif ($len == 13) 
{ 
for ($i = 0; $i < $len-1; $i++) 
{ 
if ($i % 2 == 0) 
$sum = $sum + (int)$isbn[$i]; 
else 
$sum = $sum + (int)$isbn[$i] * 3; 
} 
} 
return $sum; 
} 
function isbn_compute($isbn, $len) 
{ 
/* 
* 该函数用于计算ISBN末位校验码 
* 参数说明: 
* $isbn : isbn码 
* $len : isbn码长度 
*/ 
if ($len == 10) 
{ 
$digit = 11 - isbn_sum($isbn, $len) % 11; 
if ($digit == 10) 
$rc = 'X'; 
else if ($digit == 11) 
$rc = '0'; 
else 
$rc = (string)$digit; 
} 
else if($len == 13) 
{ 
$digit = 10 - isbn_sum($isbn, $len) % 10; 
if ($digit == 10) 
$rc = '0'; 
else 
$rc = (string)$digit; 
} 
return $rc; 
} 
function is_isbn($isbn) 
{ 
/* 
* 该函数用于判断是否为ISBN号 
* 参数说明: 
* $isbn : isbn码 
*/ 
$len = strlen($isbn); 
if ($len!=10 && $len!=13) 
return 0; 
$rc = isbn_compute($isbn, $len); 
if ($isbn[$len-1] != $rc) /* ISBN尾数与计算出来的校验码不符 */ 
return 0; 
else 
return 1; 
}

函数写好后,就可以直接调用了,下面是调用示例:
<?php echo is_isbn('9787507421781') ? '校验通过' : '校验失败'; ?>

另外我写了一个在线校验ISBN的工具,使用该工具可以在线校验ISBN码的合法性,可以点击以下链接使用:ISBN码在线校验工具
PHP 相关文章推荐
php实现的MySQL通用查询程序
Mar 11 PHP
PHP中几个常用的魔术常量
Feb 23 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
Jul 16 PHP
PHP根据IP地址获取所在城市具体实现
Nov 27 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
php缓冲输出实例分析
Jan 05 PHP
Yii2数据库操作常用方法小结
May 04 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
Jul 13 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
PHP实现的装箱算法示例
Jun 23 PHP
laravel接管Dingo-api和默认的错误处理方式
Oct 25 PHP
Laravel框架源码解析之入口文件原理分析
May 14 PHP
PHP中用正则表达式清除字符串的空白
Jan 17 #PHP
php开发环境配置记录
Jan 14 #PHP
PHP文件读写操作之文件写入代码
Jan 13 #PHP
PHP文件读写操作之文件读取方法详解
Jan 13 #PHP
PHP目录函数实现创建、读取目录教程实例
Jan 13 #PHP
PHP开发规范手册之PHP代码规范详解
Jan 13 #PHP
PHP JSON格式数据交互实例代码详解
Jan 13 #PHP
You might like
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
js 上传图片预览问题
2010/12/06 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
2016/02/27 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
nodejs socket实现的服务端和客户端功能示例
2017/06/02 NodeJs
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
Python利用IPython提高开发效率
2016/08/10 Python
Python 操作文件的基本方法总结
2017/08/10 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
关于python多重赋值的小问题
2019/04/17 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
python同时替换多个字符串方法示例
2019/09/17 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
Python log模块logging记录打印用法解析
2020/01/20 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
一句话工作感言
2014/03/01 职场文书
标准单位租车协议书
2014/09/23 职场文书
护士2014年终工作总结
2014/11/11 职场文书
小学教师自我评价
2015/03/04 职场文书