檢查使用者輸入的 ISBN-10 號碼(可含連字號、空格)是否符合校驗碼規則。支援 X 代表 10 的檢查碼。
<?php
/**
* 驗證 ISBN-10 合法性
* @param string $isbn 輸入字串(可含連字號、空格)
* @return bool true=合法, false=不合法
*/
function checkisbn($isbn) {
// 1. 移除非數字與 X 字元
$isbn10 = ereg_replace("[^0-9X]", "", $isbn);
// 2. 依 ISBN-10 演算法計算檢查碼
// 權重 10~2 對應前 9 位數字
$sum = 0;
for ($i = 0; $i < 9; $i++) {
$sum += (10 - $i) * intval($isbn10[$i]);
}
$checkdigit = 11 - ($sum % 11);
// 3. 處理特殊值
if ($checkdigit == 10) $checkdigit = 'X';
if ($checkdigit == 11) $checkdigit = 0;
// 4. 比對第 10 位
return ($checkdigit == $isbn10[9]);
}
?>
strtoupper())。11 - (sum % 11) 得到檢查碼(0-10)。X,11 → 0。$tests = array(
'0-306-40615-2', // 合法
'7-301-12345-6', // 不合法
'ISBN 0-306-40615-2', // 含前綴也可
'030640615X' // 以 X 結尾
);
foreach ($tests as $isbn) {
echo $isbn . ' => ' . (checkisbn($isbn) ? '✓' : '✗') . "\n";
}
ereg_replace,現代 PHP 建議改用 preg_replace。strlen($isbn10) === 10 判斷。