- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 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(空格)
.
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以上。
对于严格验证维基百科article对于 ISBN 有一些 PHP 验证函数 ISBN-10和 ISBN-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/
我如何在 MySQL 数据库中查询格式为 000-0-0000-0000-0 的 ISBN 与具有相同位数但没有破折号的 ISBN?是否有我可以使用的 SQL 正则表达式替换方法或其他方法?任何建议将
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 11 年前关闭。 Improve this
我有一个 If-else 语句,它检查字符串以查看是否有 ISBN-10 或 ISBN-13(图书 ID)。 我面临的问题是 ISBN-10 检查发生在 ISBN-13 检查之前,ISBN-10 检查
我有ISBN数字(10位和13位数字),但没有破折号。 现在,我正在寻找一种自动添加这些破折号的方法。 我在这里找到了一些有用的信息: http://www.isbn.org/standards/ho
我正在尝试编写一个程序来读取书籍的库存文件并生成写入屏幕的库存报告。我在尝试格式化 ISBN 编号时遇到问题。输入文件中的 ISBN 以 10 位数字序列给出(例如:0321479270)。对于报告,
此代码从字符串中删除(忽略)“-”,但仅删除一次。在更改 ISBN 字符串后,如何重置 *p 使其再次执行循环? char ISBN[] = "3-423-62167-2"; char *p = IS
散列一本书的 ISBN 的好方法是什么?抱歉让我澄清一下,我想对 1000 本书的 ISBN 进行哈希处理。但是数组可能会增长。它是一个哈希表而不是加密。编程语言是 c 但这是一个普遍的问题。我想知道
我正在寻找一种方法来即时获取教科书封面的图像(基于 ISBN )。 我正在考虑从以下位置解析 html: 亚马逊 http://www.amazon.com/s/ref=nb_sb_noss?&fie
对于这个具有说明性目的的问题,我将编写 Javascript 代码,但这只是一个说明,这个问题与语言无关。 我需要编写一个函数,将条形码文本(不是图像)作为输入并返回 ISBN 作为输出。 ISBN
我有一个非常长的字符串,我想将其解析为出现在子字符串“ISBN”之后的数值。但是,这 13 位数字的分组可以通过“-”字符进行不同的排列。示例:(这些都是有效的 ISBN)123-456-789-12
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
我想知道是否有网络服务或数据库可以让我们在将用户输入存储到数据库之前以编程方式检查用户输入是否为有效的 ISBN 编号。或者是否有一种算法允许程序员这样做 最佳答案 如果看Wikipedia page
我需要一个正则表达式来验证用户输入的 ISBN 号。 ISBN 必须是仅包含以下内容的字符串:[10 或 13 位数字] 和连字符 我尝试了 ^[\d*\-]{10}|[\d*\-]{13}$ 但不起
因此,作为我的类(class)项目,我需要编写一个程序,让用户输入 ISBN 号码的前 n 位数字,并以第十位数字进行响应。我一直在无休止地寻找一些东西,让我的程序询问用户是否要再次运行该程序,然后在
这个问题让我很困惑。我尝试使用这样的循环:基本上我尝试从输入中获取第一个数字并执行公式,但它似乎不起作用。它看起来很简单,但我无法弄清楚。你可以帮帮我吗?谢谢。 public static int I
这实际上不是家庭作业,我只是在下周开始计算机科学之前浏览离散数学书中的一些问题。 无论如何,其中一个问题要求我编写一个程序来执行此算法(它对此进行了解释)。我坚持的部分是如何取 9 位数字并将其“拆分
我的应用程序目的只是简单地捕获一个 ISBN 号,然后将 ISBN 转换为一个字符串。我知道 zxing 项目,但是在浏览了他们的代码和研究之后,我找不到不使用 Intent 来使用他们的代码的方法。
我在家庭作业中遇到了问题,我需要检查 ISBN 代码是否有效。这是一个初学者 C++ 类(class),我对所有这些都是新手。现在,无论我输入什么 ISBN,它都会告诉我它们都是有效的。如果有人可以帮
好的,我想建立一个小型图书馆的数据库。 我在数据库方面的经验有限,在从网络服务器查询方面没有经验。 我要检索标题、出版商、作者、描述等信息我能想到的最简单的方法是通过 ISBN 查找它们。 我以前接触
现在有这么多的服务,很多关于这个话题的搜索结果都在谈论已经被弃用的服务。我现在只是第一次这样做。我在 C# 中有一个小图书馆应用程序,我想用它来查询亚马逊服务以更新书籍封面图片、ISBN、作者等。 最
我是一名优秀的程序员,十分优秀!