【问题标题】:Determine if 10 digit string is valid Amazon ASIN确定 10 位字符串是否为有效的 Amazon ASIN
【发布时间】:2011-01-08 13:12:56
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 字符串成为有效 ASIN 需要满足哪些条件? 10 个字符长,应包含数字(多少 - 最小/最大 - 在什么位置),没有空格和...?
  • ASIN 编号的长度为 10 个字符。这是亚马逊发布的唯一设定要求。通常它们也可以是 10 位数的 ISBN 号码(但这很容易,因为它都是数字。)它们通常以 B 开头,但并非总是如此,它们混合了字母和数字,没有空格,所以没有 " ASIN RegEx”方法,可以区分可能的搜索词和 ASIN。
  • 请注意,到目前为止,在我能找到的所有情况下,有效 ASIN(也不是 ISBN)的第一个字符始终是 B。但是,根据亚马逊的说法,即不保证。
  • 我现在又开始使用 AWS 产品广告 API。
  • 我将 Ulrich Mierendorff 的一篇题为“使用 PHP 的 Amazon® AWS HMAC 签名请求”的文章中的信息与 Amazon AWS 产品广告 API 结合使用。 mierendo.com/software/aws_signed_query

标签: php amazon


【解决方案1】:

2017 年更新

@Leonid 评论说他找到了 ASIN BT00LLINKI

尽管 ASIN 似乎不是严格递增的,但最旧的非 ISBN ASIN 确实往往比新 ASIN 有更多的零。也许我们不可避免地会开始看到没有零填充的 ASIN(然后是什么,我想知道......)。所以我们现在正在寻找“B”后跟 9 个字母数字字符(或一个 ISBN)——不幸的是,“丢失”那个 0 使得误报变得容易得多。

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

原答案

在 Javascript 中,我使用以下正则表达式来确定一个字符串是否是或包含什么是似是而非的 ASIN:

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

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

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

正如其他人所提到的,亚马逊并未真正披露该规范。但在实践中,我只看到了两种可能的 ASIN 格式:

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

如果有人遇到不符合该模式的 ASIN,请加入。实际上可能会比这更严格,但我不确定。非 ISBN ASIN 可能只使用一部分字母字符,但即便如此,它们也会使用其中的大部分。有些似乎比其他人出现得更频繁,至少(K、Z、Q、W...)

【讨论】:

  • 值得一提的是它确实是一个“似是而非的”ASIN :-)。
  • 确实,@Styxxy -- 我认为这就是问题的真正含义。当然,如果不询问亚马逊,就无法知道可能的 ASIN 是否在使用中,但您至少可以知道它值得一开始就进行检查。如果产品广告或 MWS 产品 API 对一个人的需求来说过于繁重,那么 Flurin 的答案仍然是可靠的。幸运的是,大多数人可以忽略 DSA 的担忧。无需深入细节,您实际上可以假设一个 ASIN 永远不会指向两种完全不同的产品。存在异常,但非常罕见(并且是错误)。
  • 对于最近遇到此答案的任何人,B0000000BSB00000BIES 目前是链接到真实产品的有效 ASIN... 这些不符合上述模式。似乎两年内发生了很多变化!
  • 抛开幽默,这两个例子都符合上述模式——(/^B\d{2}\w{7}|\d{9}(X|\d)$/ i).test('B00000BIES') // true
  • 我可以获得大量随机的、逗号分隔的 ASINS。如果有人想要一份清单,请给我发消息。 (我还没有进行大规模检查,但我很快就会):)
【解决方案2】:

对于 PHP,有一个有效的 ASIN 正则表达式 here

function isAsin($string){
    $ptn = "/B[0-9]{2}[0-9A-Z]{7}|[0-9]{9}(X|0-9])/";
    return preg_match($ptn, $string, $matches) === 1;
}

【讨论】:

    【解决方案3】:

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

    http://www.amazon.com/dp/YOUR10DIGITASIN

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

    【讨论】:

    • 是的,我正在考虑这个问题,但不确定亚马逊是否希望我以这种方式访问​​该网站并可能产生数千个 404 错误。我想我应该问他们=)
    • 这行得通,但请注意有些返回了 301 响应。但是,这似乎不在亚马逊网站的 TOS 范围内。 =/
    • 如果 ASIN 是卖家特定的 ASIN,它也不起作用 - 他们称之为 FNSKU,它主要用作亚马逊库存中卖家自有商品的条形码
    【解决方案4】:

    在尝试了几个解决方案(包括投票最多的答案)后,它们在 PHP 中运行不佳。 (例如 8619203011 显示为 ASIN)

    这是一个非常有效的解决方案:

    function isAsin($string){
        $ptn = "/^(?i)(B0|BT)[0-9A-Z]{8}$/";
        if (preg_match($ptn, $string, $matches)) {
            return true;
        }
    }
    $testAsins = array('k023l5bix8', 'bb03l5bix8', 'b143l5bix8', 'bt00plinki', '         ', '');
    foreach ($testAsins as $testAsin) {
        if(isAsin($testAsin)){
            echo $testAsin." is ASIN"."<br>";
        } else {
            echo $testAsin." is NOT ASIN"."<br>";
        }
    }
    

    说明:

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

    /^ = 开始

    (?i) = 不区分大小写

    (B0|BT)= 以 B0 或 BT 开头

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

    {8} = 允许 8 个数字或字母(在 B0 或 BT 的 +2 之上)

    【讨论】:

    • 感谢您的代码,它适用于 ASIN。但是像 1082219657 这样的实际书籍(不是电子书)的代码怎么样?
    • @RickHellewell 这与原来的问题不同,所以如果你想得到答案,你应该问一个新问题。
    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2023-03-21
    • 2012-04-02
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多