これには、正規表現が 1 つだけ必要です。次に、より効率的な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 値 ( を返す1
) または ISBN-13 値 ( を返す2
) が含まれているかどうかを確認します。そうでない場合は、 が返されfalse
ます。
上記のデモを参照してください。
ISBN の検証:
厳密な検証のために、ISBNのウィキペディアの記事には、 ISBN-10およびISBN-13の PHP 検証関数がいくつかあります。以下は、上記の関数のわずかに変更されたバージョンに対して使用するために、コピー、整理、および変更された例です。
return ブロックを次のように変更します。
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;
}
上記のデモを参照してください。