您实际上只需要一个正则表达式。然后进行更有效的检查,以查看哪一个匹配。以下内容将匹配字符串中带或不带连字符的 ISBN-10 和 ISBN-13 值,并可选择以字符串 或 开头。strlen()ISBN:ISBN:(space)ISBN(space)
查找 ISBN :
function findIsbn($str)
{
    $regex = '/\b(?:ISBN(?:: ?| ))?((?:97[89])?\d{9}[\dx])\b/i';
    if (preg_match($regex, str_replace('-', '', $str), $matches)) {
        return (10 === strlen($matches[1]))
            ? 1   // ISBN-10
            : 2;  // ISBN-13
    }
    return false; // No valid ISBN found
}
var_dump(findIsbn('ISBN:0-306-40615-2'));     // return 1
var_dump(findIsbn('0-306-40615-2'));          // return 1
var_dump(findIsbn('ISBN:0306406152'));        // return 1
var_dump(findIsbn('0306406152'));             // return 1
var_dump(findIsbn('ISBN:979-1-090-63607-1')); // return 2
var_dump(findIsbn('979-1-090-63607-1'));      // return 2
var_dump(findIsbn('ISBN:9791090636071'));     // return 2
var_dump(findIsbn('9791090636071'));          // return 2
var_dump(findIsbn('ISBN:97811'));             // return false
这将搜索提供的字符串,以查看它是否包含可能的 ISBN-10 值(返回)或 ISBN-13 值(返回)。如果没有,它将返回。12false
请参阅上面的演示。
验证 ISBN :
为了严格验证,ISBN的维基百科文章具有一些针对ISBN-10和ISBN-13的PHP验证函数。以下是复制,整理和修改的示例,以针对上述函数的略微修改版本使用。
将返回块更改为:
    return (10 === strlen($matches[1]))
        ? isValidIsbn10($matches[1])  // ISBN-10
        : isValidIsbn13($matches[1]); // ISBN-13
验证 ISBN-10:
function isValidIsbn10($isbn)
{
    $check = 0;
    for ($i = 0; $i < 10; $i++) {
        if ('x' === strtolower($isbn[$i])) {
            $check += 10 * (10 - $i);
        } elseif (is_numeric($isbn[$i])) {
            $check += (int)$isbn[$i] * (10 - $i);
        } else {
            return false;
        }
    }
    return (0 === ($check % 11)) ? 1 : false;
}
验证 ISBN-13:
function isValidIsbn13($isbn)
{
    $check = 0;
    for ($i = 0; $i < 13; $i += 2) {
        $check += (int)$isbn[$i];
    }
    for ($i = 1; $i < 12; $i += 2) {
        $check += 3 * $isbn[$i];
    }
    return (0 === ($check % 10)) ? 2 : false;
}
请参阅上面的演示。