16

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

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

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

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

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

4

4 回答 4

35

2017 年更新

@Leonid 评论说他找到了 ASIN BT00LLINKI

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

/^(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...)

于 2012-10-10T20:24:38.393 回答
4

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

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;
}
于 2014-01-06T09:58:20.260 回答
0

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

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

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

于 2010-01-23T12:47:06.543 回答
0

在尝试了几个解决方案(包括投票最多的答案)之后,它们在 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 之上)

于 2019-02-19T15:04:57.760 回答