使用正则表达式验证ISBN号

时间:2016-12-21 20:46:32

标签: php regex isbn

我需要一个正则表达式来验证用户输入的ISBN号。

ISBN必须是仅包含的字符串: [10 or 13 digits] and hyphens

我尝试了^[\d*\-]{10}|[\d*\-]{13}$,但它不起作用。

我的正则表达式仅匹配:978-1-56611-56619-901257561035

它应该返回以下结果:

"978-1-56619-909-4 2" => false
"978-1-56619-909-4" => true
"1-56619-909-3 " => false
"1-56619-909-3" => true
"isbn446877428ydh" => false
"55 65465 4513574" => false
"1257561035" => true
"1248752418865" => true

我真的很感激任何帮助。

2 个答案:

答案 0 :(得分:3)

你可以使用这个正则表达式做出积极的前瞻:

^(?=(?:\D*\d){10}(?:(?:\D*\d){3})?$)[\d-]+$

RegEx Demo

(?=(?:\D*\d){10}(?:(?:\D*\d){3})?$)是一个积极的先行,可以确保输入中有10位或13位数。

答案 1 :(得分:2)

如已接受的答案所述,并非所有10或13位数字都是有效的ISBN。

ISBN由五组数字组成,这些数字组成13位数字。在2007年,标准从10位数字移到了此数字。这五个组可以接受各种长度的数字,这使得ISBN难以验证。 参考https://en.wikipedia.org/wiki/International_Standard_Book_Number

一个解决方案是这样的: ^(?:ISBN(?:-13)?:?\ )?(?=[0-9]{13}$|(?=(?:[0-9]+[-\ ]){4})[-\ 0-9]{17}$)97[89][-\ ]?[0-9]{1,5}[-\ ]?[0-9]+[-\ ]?[0-9]+[-\ ]?[0-9]$ 来源:O'Reilly Regular Expressions Cookbook, 2nd edition

您可能会在这里找到许多可能的用于ISBN验证的正则表达式:https://regexlib.com/Search.aspx?k=ISBN