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 相关文章推荐
echo(),print(),print_r()之间的区别?
Nov 19 PHP
php获取mysql版本的几种方法小结
Mar 25 PHP
快速开发一个PHP扩展图文教程
Dec 12 PHP
php中定时计划任务的实现原理
Jan 08 PHP
ThinkPHP应用模式扩展详解
Jul 16 PHP
Linux下安装oracle客户端并配置php5.3
Oct 12 PHP
PHP模板引擎Smarty内建函数详解
Apr 11 PHP
php自定义函数实现二维数组按指定key排序的方法
Sep 29 PHP
PHP代码重构方法漫谈
Apr 17 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 PHP
PHP数组访问常用方法解析
Sep 05 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 getsiteurl()函数
2009/09/05 PHP
探讨如何在php168_cms中提取验证码
2013/06/08 PHP
PHP图片加水印实现方法
2016/05/06 PHP
laravel解决迁移文件一次删除创建字段报错的问题
2019/10/24 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
基于jQuery架构javascript基础体系
2011/01/01 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
node.js中的fs.chownSync方法使用说明
2014/12/16 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
2015/05/11 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
node之本地服务器图片上传的方法示例
2019/03/26 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
python创建线程示例
2014/05/06 Python
Python 26进制计算实现方法
2015/05/28 Python
python文件拆分与重组实例
2018/12/10 Python
python实现贪吃蛇游戏
2020/03/21 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
Python的互斥锁与信号量详解
2019/09/12 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
前台文员岗位职责及工作流程
2013/11/19 职场文书
田径运动会开幕式及主持词
2014/03/28 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
干部考核工作总结2015
2015/07/24 职场文书
高中生社会实践心得体会
2016/01/14 职场文书