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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
php 更新数据库中断的解决方法
Jun 05 PHP
PHP中获取变量的变量名的一段代码的bug分析
Jul 07 PHP
php.ini中date.timezone设置分析
Jul 29 PHP
php在文件指定行中写入代码的方法
May 23 PHP
php排序算法(冒泡排序,快速排序)
Oct 09 PHP
php 检查电子邮件函数(自写)
Jan 16 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
php中file_exists函数使用详解
May 08 PHP
PHP实现适用于文件内容操作的分页类
Jun 15 PHP
Smarty3配置及入门语法
Feb 22 PHP
PHP设计模式之抽象工厂模式实例分析
Mar 25 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
PHP+DBM的同学录程序(2)
2006/10/09 PHP
php array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
jQuery find和children方法使用
2011/01/31 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
Python是编译运行的验证方法
2015/01/30 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
2019/11/15 Python
win10下python3.8的PIL库安装过程
2020/06/08 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
美国精油公司:Plant Therapy
2019/05/17 全球购物
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
匡威西班牙官网:Converse西班牙
2019/10/01 全球购物
中文专业毕业生自荐信
2013/10/28 职场文书
考试诚信承诺书
2014/05/23 职场文书
劳动竞赛口号
2014/06/16 职场文书
医德医风个人工作总结2014
2014/11/14 职场文书
中学生学习保证书
2015/02/26 职场文书
学校学期工作总结
2015/08/13 职场文书