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防止sql注入代码实例
Dec 18 PHP
php获取淘宝分类id示例
Jan 16 PHP
如何让搜索引擎抓取AJAX内容解决方案
Aug 25 PHP
thinkphp文件处理类Dir.class.php的用法分析
Dec 08 PHP
Joomla语言翻译类Jtext用法分析
May 05 PHP
php版微信自动获取收货地址api用法示例
Sep 22 PHP
Zend Framework前端控制器用法示例
Dec 11 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
Jun 06 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
php实现微信模板消息推送
Mar 30 PHP
Laravel 自定命令以及生成文件的例子
Oct 23 PHP
php框架知识点的整理和补充
Mar 01 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
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
Javascript的匿名函数小结
2009/12/31 Javascript
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
jquery xMarquee实现文字水平无缝滚动效果
2014/04/29 Javascript
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
浅谈JavaScript字符串与数组
2015/06/03 Javascript
深入理解jQuery事件绑定
2016/06/02 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
Django中reverse反转并且传递参数的方法
2019/08/06 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
Python中格式化字符串的四种实现
2020/05/26 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
一套英文Java笔试题面试题
2016/04/21 面试题
销售主管岗位职责
2014/02/08 职场文书
房屋买卖协议书
2014/04/10 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
小学清明节活动总结
2014/07/04 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
高中生逃课检讨书
2014/10/10 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
鉴史问廉观后感
2015/06/10 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书
离婚协议书范文2016
2016/03/18 职场文书
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技