18

我有一个10位数的字符串正在传递给我,我想在进行更多处理和/或重定向之前验证它是否是有效的ASIN。

我知道非ISBN ASIN总是非数字的,长度为10个字符

我只想知道传递的项目是一个有效的ASIN,还是在我已经排除了它可能是一个ISBN之后,它只是一个搜索字符串。

例如,“SOUNDBARD”是搜索词,而“B000J5XS3C”是ASIN,“1412775884”是ISBN。

有没有一种轻量级的方法来检查ASIN?

5
  • 字符串成为有效ASIN需要满足哪些条件?10个字符长,应该包含数字(多少-最小/最大-在什么位置),没有空格和。。。? 评论 2010年1月23日12:35
  • ASIN编号长度为10个字符。这是亚马逊发布的唯一一个固定要求。通常,它们也可以是10位ISBN编号(但这很容易,因为它都是数字。)它们通常以B开头,但并不总是这样,并且它们混合了字母和数字,没有空格,因此没有“ASIN RegEx”方法来区分可能的搜索词和ASIN。
    – RAD驼鹿
    评论 2010年1月23日13:08
  • 有一点值得注意,在我目前能找到的所有情况下,有效ASIN(不是ISBN)的第一个字符总是B。然而,根据亚马逊的说法,这并不能保证。
    – RAD驼鹿
    评论 2010年1月24日4:31
  • 我现在回到使用AWS产品广告API。
    – RAD驼鹿
    评论 2010年1月24日4:37
  • 1
    我使用了Ulrich Mierendorff撰写的一篇题为“Amazon®AWS HMAC signed request using PHP”的文章中的信息以及Amazon AWS Product Advertising API。mierendo.com/software/aws_signed_query
    – RAD驼鹿
    评论 2010年1月24日4:42

4个答案4

重置为默认值
40

2017年更新

@Leonid评论说他找到了ASINBT00LLINKI公司.

虽然ASIN似乎不是严格递增的,但最古老的非ISBN ASIN往往比最新的ASIN有更多的零。也许这是不可避免的,我们将开始看到没有零填充的ASIN(然后呢,我想知道……)。因此,我们现在寻找的是“B”,后跟九个字母数字字符(或ISBN)——不幸的是,“丢失”零会使误报变得容易得多。

/^(B[\dA-Z]{9}|\d{9}(X|\d))$/

原始答案

在Javascript中,我使用以下regexp来确定字符串是否为ASIN或是否包含ASIN:

/^\s*(B\d{2}[A-Z\d]{7}|\d{9}[X\d])*$/

或者,不用担心额外的空白或捕获:

/^(B\d{2}[A-Z\d]{7}|\d{9}[X\d])$/

正如其他人所提到的,Amazon并没有真正公布规范。实际上,我只看到了ASIN的两种可能格式:

  1. 10位ISBN,即9位+最后一个字符,可以是数字或“X”。
  2. 字母B后面是两个数字,后面是七个ASCII范围的字母数字字符(字母字符为大写)。

如果有人遇到了不符合这种模式的ASIN,请插话。实际上可能会有更多的限制,但我不确定。非ISBN ASIN可能只使用字母字符的子集,但即使如此,它们也会使用大多数字母字符。至少(K,Z,Q,W…)

14
  • 值得注意的是,这确实是一个“似是而非”的ASIN:-)。 评论 2012年10月10日23:16
  • 事实上,@Styxxy——我认为这就是问题的真正含义。当然,如果不询问Amazon,就无法知道可能的ASIN是否正在使用中,但您至少可以知道它值得首先检查。如果产品广告或MWS产品API对于一个人的需求来说太重,那么Flurin的答案仍然是可靠的。幸运的是,DSA的担忧是大多数人可以忽略的。没有太多细节,你实际上可以假设一个ASIN从不指向两个完全不同的产品。存在异常,但非常罕见(并且是错误)。
    – 分号
    评论 2012年10月11日1:39
  • 对于最近遇到这个答案的人来说,B000000BSB00000只鸟当前有效的ASIN链接到真实产品。。。这些不符合上述模式。两年来似乎发生了很大变化! 评论 2014年10月20日23:11
  • 1
    撇开幽默不谈,这两个例子都符合上面的模式——(/^B\d{2}\w{7}|\d{9}(X|\d)$/i).test('B00000BIES')//true
    – 分号
    评论 2014年10月20日23:37
  • 1
    我可以得到大量随机的、逗号分隔的ASIN。如果有人想要一张名单,给我发一条短信。(我还没有进行大规模检查,但很快就会进行):) 评论 2017年3月6日23:46
4

对于PHP,ASIN有一个有效的正则表达式在这里.

函数isAsin($string){$ptn=“/B[0-9]{2}[0-9A-Z]{7}|[0-9]}(X|0-9])/”;返回preg_match($ptn,$string,$matches)===1;}
0
0

也许你可以在亚马逊网站上查看ASIN是否存在。

网址:http://www.aamazon.com/dp/YOUR10DIGITASIN

当产品存在时,此URL返回http-statuscode=200,如果不是有效的ASIN,则返回404。

  • 1
    是的,我正在考虑这个问题,但不确定亚马逊是否希望我这样访问网站,并可能产生数千个404错误。我想我应该问他们=)
    – RAD驼鹿
    评论 2010年1月23日12:59
  • 这起到了作用,但需要注意的是,有些人返回了301响应。然而,这似乎超出了亚马逊网站的TOS=/
    – RAD驼鹿
    评论 2010年1月24日4:32
  • 如果ASIN是特定于卖家的ASIN,它也不起作用-他们称之为FNSKU,它主要用作亚马逊库存中卖家所有商品的条形码 评论 2015年5月9日0:07
0

在尝试了两种解决方案(包括最受欢迎的答案)后,它们在PHP中没有很好地工作。(例如,8619203011显示为ASIN)

以下是非常有效的解决方案:

函数isAsin($string){$ptn=“/^(?i)(B0|BT)[0-9A-Z]{8}$/”;if(preg_match($ptn,$string,$matches)){返回true;}}$testAsins=数组('k023l5bix8','bb03l5bix2','b143l5bix8','bt00plinki','','');foreach($testAsins作为$testAsin){if(isAsin($testAsin)){echo$testAsin。“是ASIN”。“<br>”;}其他{echo$testAsin。“不是ASIN”。“<br>”;}}

说明:

/^(?i)(B0|BT)[0-9A-Z]{8}$/

/^=开始

(?i)=区分大小写

(B0|BT)=从B0或BT开始

[0-9A-Z]=任何数字或字母

{8} =允许8个数字或字母(位于B0或BT中+2的顶部)

2
  • 感谢您的代码,它适用于ASIN。但是,像1082219657这样的实际书籍(不是电子书)的代码怎么样? 评论 2019年9月10日20:19
  • @这与最初的问题不同,所以如果你想得到答案,你应该问一个新问题。 评论 2021年5月3日14:52

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.