gpt4 book ai didi

php - 区分 ISBN-10 和 ISBN-13 的正则表达式

转载 作者:IT王子 更新时间:2023-10-28 23:56:36 26 4
gpt4 key购买 nike

我有一个 If-else 语句,它检查字符串以查看是否有 ISBN-10 或 ISBN-13(图书 ID)。

我面临的问题是 ISBN-10 检查发生在 ISBN-13 检查之前,ISBN-10 检查将匹配任何包含 10 个或更多字符的内容,因此可能会将 ISBN-13 误认为是 ISBN-10 .

这是代码...

$str = "ISBN:9780113411436";

if(preg_match("/\d{9}(?:\d|X)/", $str, $matches)){
echo "ISBN-10 FOUND\n";
//isbn returned will be 9780113411
return 0;
}

else if(preg_match("/\d{12}(?:\d|X)/", $str, $matches)){
echo "ISBN-13 FOUND\n";
//isbn returned will be 9780113411436
return 1;
}

如何确保避免此问题?

最佳答案

你真的只需要一个正则表达式。然后进行更有效的 strlen() 检查以查看哪个匹配。以下将匹配字符串中的 ISBN-10 和 ISBN-13 值(带或不带连字符),并且可以选择在字符串 ISBN:ISBN:(space)ISBN(空格).

查找 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

DEMO以上。


验证 ISBN:

对于严格验证维基百科article对于 ISBN 有一些 PHP 验证函数 ISBN-10ISBN-13 .以下是复制、整理和修改的示例,以用于上述函数的略微修改版本。

将返回 block 更改为:

    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;
}

DEMO以上。

关于php - 区分 ISBN-10 和 ISBN-13 的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14095778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com