首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 實作 ISBN 碼驗證函式:支援 ISBN-10 與 ISBN-13 雙格式檢核

     編輯:PHP 相關知識

什麼是 ISBN 國際標準書號?

ISBN(International Standard Book Number)是國際通用的書籍唯一識別碼,用於區分不同版本、不同出版商的圖書。早期採用 10 碼格式(ISBN-10),自 2007 年起全面改為 13 碼(ISBN-13),但舊版書籍仍大量流通,因此嚴謹的圖書管理系統必須同時支援兩種格式的驗證。

ISBN 最後一位為檢查碼,透過特定演算法計算前幾位數字的加權總和,再取模運算得出。驗證時只需重新計算檢查碼,比對輸入的最後一位是否一致即可判斷格式合法性(注意:此驗證僅檢查結構正確性,不保證該 ISBN 確實已出版)。

ISBN-10 檢查碼演算法

以 7-309-04547 為例(前 9 碼):

  1. 計算加權和:S = 7×10 + 3×9 + 0×8 + 9×7 + 0×6 + 4×5 + 5×4 + 4×3 + 7×2 = 226
  2. 取模 11:M = 226 mod 11 = 6
  3. 計算差值:N = 11 - M = 5
  4. 規則:N=10 → 檢查碼為 'X';N=11 → 檢查碼為 '0';否則檢查碼即為 N。

本例檢查碼為 5,完整 ISBN 為 7-309-04547-5。

ISBN-13 檢查碼演算法

以 978-986-181-728 為例(前 12 碼):

  1. 奇數位權重 1、偶數位權重 3,計算加權和: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
  2. 取模 10:M = 164 mod 10 = 4
  3. 計算差值:N = 10 - M = 6
  4. 規則:N=10 → 檢查碼為 '0';否則檢查碼即為 N。

本例檢查碼為 6,完整 ISBN 為 978-986-181-728-6。

PHP 實作程式碼

以下提供三個函式: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,方便直接用於條件判斷。
  • 程式碼採用純 PHP 實作,無外部依賴,可直接整合至專案中。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved