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 归并排序 数组交集
May 10 PHP
微博短链接算法php版本实现代码
Sep 15 PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
Apr 15 PHP
解析thinkphp的左右值无限分类
Jun 20 PHP
php删除数组元素示例分享
Feb 17 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
Mar 23 PHP
php根据日期显示所在星座的方法
Jul 13 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
vmware linux系统安装最新的php7图解
Apr 14 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
Apr 26 PHP
PHP后门隐藏的一些技巧总结
Nov 04 PHP
PHP7变量处理机制修改
Mar 09 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伪静态页面函数附使用方法
2008/06/20 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
CodeIgniter配置之autoload.php自动加载用法分析
2016/01/20 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
javascript之ESC(第二类混淆)
2007/05/06 Javascript
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
JavaScript获取网页支持表单字符集的方法
2015/04/02 Javascript
javascript每日必学之封装
2016/02/23 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
2019/05/15 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
[01:11:10]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG加赛
2014/05/26 DOTA
Python字符转换
2008/09/06 Python
浅谈编码,解码,乱码的问题
2016/12/30 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
pytorch对可变长度序列的处理方法详解
2018/12/08 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
pytorch:torch.mm()和torch.matmul()的使用
2019/12/27 Python
浅谈Python协程
2020/06/17 Python
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
2013/01/06 HTML / CSS
HTML5拖放API实现自动生成相框功能
2020/04/07 HTML / CSS
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
应届生幼儿园求职信
2013/11/12 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
督导岗位职责范本
2015/04/10 职场文书
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL