ISBN(International Standard Book Number)是國際通用的書籍唯一識別碼,用於區分不同版本、不同出版商的圖書。早期採用 10 碼格式(ISBN-10),自 2007 年起全面改為 13 碼(ISBN-13),但舊版書籍仍大量流通,因此嚴謹的圖書管理系統必須同時支援兩種格式的驗證。
ISBN 最後一位為檢查碼,透過特定演算法計算前幾位數字的加權總和,再取模運算得出。驗證時只需重新計算檢查碼,比對輸入的最後一位是否一致即可判斷格式合法性(注意:此驗證僅檢查結構正確性,不保證該 ISBN 確實已出版)。
以 7-309-04547 為例(前 9 碼):
S = 7×10 + 3×9 + 0×8 + 9×7 + 0×6 + 4×5 + 5×4 + 4×3 + 7×2 = 226M = 226 mod 11 = 6N = 11 - M = 5N=10 → 檢查碼為 'X';N=11 → 檢查碼為 '0';否則檢查碼即為 N。本例檢查碼為 5,完整 ISBN 為 7-309-04547-5。
以 978-986-181-728 為例(前 12 碼):
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) = 164M = 164 mod 10 = 4N = 10 - M = 6N=10 → 檢查碼為 '0';否則檢查碼即為 N。本例檢查碼為 6,完整 ISBN 為 978-986-181-728-6。
以下提供三個函式:isbn_sum() 計算加權和、isbn_compute() 計算檢查碼、is_isbn() 執行完整驗證。
<?php
function isbn_sum($isbn, $len) {
$sum = 0;
if ($len == 10) {
for ($i = 0; $i < $len - 1; $i++) {
$sum += (int)$isbn[$i] * ($len - $i);
}
} elseif ($len == 13) {
for ($i = 0; $i < $len - 1; $i++) {
if ($i % 2 == 0) {
$sum += (int)$isbn[$i];
} else {
$sum += (int)$isbn[$i] * 3;
}
}
}
return $sum;
}
function isbn_compute($isbn, $len) {
if ($len == 10) {
$digit = 11 - isbn_sum($isbn, $len) % 11;
if ($digit == 10) $rc = 'X';
elseif ($digit == 11) $rc = '0';
else $rc = (string)$digit;
} elseif ($len == 13) {
$digit = 10 - isbn_sum($isbn, $len) % 10;
$rc = ($digit == 10) ? '0' : (string)$digit;
}
return $rc;
}
function is_isbn($isbn) {
$len = strlen($isbn);
if ($len != 10 && $len != 13) return false;
$check = isbn_compute($isbn, $len);
return $isbn[$len - 1] === $check;
}
// 使用範例
echo is_isbn('9787507421781') ? '驗證通過' : '驗證失敗';
?>
978-7-5074-2178-1 → 9787507421781)。true/false,方便直接用於條件判斷。