使用正则表达式验证 ISBN 号

Lou*_*ran 4 php regex isbn

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

ISBN 必须是一个字符串,只包含: [10 or 13 digits] and hyphens

我试过了,^[\d*\-]{10}|[\d*\-]{13}$但没有用。

我的正则表达式只匹配:978-1-5661, 1-56619-90,1257561035

它应该返回以下结果:

"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
Run Code Online (Sandbox Code Playgroud)

我真的很感激任何帮助。

anu*_*ava 7

您可以使用此正则表达式进行正向预测:

^(?=(?:\D*\d){10}(?:(?:\D*\d){3})?$)[\d-]+$
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

(?=(?:\D*\d){10}(?:(?:\D*\d){3})?$) 是一个正向前瞻,确保我们在输入中有 10 或 13 位数字。

  • 人们应该小心使用这个解决方案。它确实匹配 10 位或 13 位数字,但并非所有 10 位和 13 位数字都是 ISBN。例如“978-0-306-40615-6”是 13 位数字,但不是有效的 ISBN (5认同)
  • 尽管它超出了原始问题的范围,但请注意,ISBN 10 的校验位可以是“X”(代表“10”)。上面的正则表达式非常好,只是它没有考虑这种可能性。我正在尝试利用 @anubhava 的解决方案,但包括此例外(我的正则表达式能力很弱 - 这就是我在这里的原因!)。 (3认同)

Tho*_*den 6

正如接受的答案中提到的,并非所有 10 或 13 位数字都是有效的 ISBN。

ISBN 由五组数字组成,共 13 位数字。2007 年,该标准从 10 位数改为 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,第 2 版

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