我有一个10位数的字符串传递给我,我想在进行更多处理和/或重定向之前验证它是否是有效的ASIN。
我知道非ISBN ASIN始终是非数字的,长度为10个字符
我只是希望能够判断传递的项目是否是有效的ASIN,或者在我已经消除它可能是ISBN之后它只是一个搜索字符串。
例如“SOUNDBOARD”是搜索词,而“B000J5XS3C”是ASIN,“1412775884”是ISBN。
是否有轻量级的方法来检查ASIN?
答案 0 :(得分:23)
@Leonid评论说他找到了ASIN BT00LLINKI
。
虽然ASIN似乎不是严格增量的,但是最老的非ISBN ASIN确实比新的ASIN具有更多的零。也许我们不可避免地开始看到没有零填充的ASIN(然后是什么,我想知道......)。所以我们现在正在寻找“B”,然后是9个字母数字字符(或ISBN) - 不幸的是,这个零的“损失”使得误报更加容易。
/^B[\dA-Z]{9}|\d{9}(X|\d)$/
在Javascript中,我使用以下正则表达式来确定字符串是否合理地是ASIN:
/^\s*(B\d{3}\w{6}|\d{9}(?:X|\d))\s*$/
或者,不用担心额外的空白或捕获:
/^B\d{2}\w{7}|\d{9}(X|\d)$/
正如其他人所说,亚马逊并未真正披露该规范。实际上,我只看到了两种可能的ASIN格式:
如果有人遇到不符合该模式的ASIN,请插入。实际上可能会比这更严格,但我不确定。非ISBN ASIN可能只使用字母字符的子集,但即使如此,它们也会使用大部分字符。有些似乎比其他人更频繁,至少(K,Z,Q,W ......)
答案 1 :(得分:3)
对于PHP,Asins有一个有效的正则表达式:http://www.sebastianviereck.de/en/php-ueberpruefen-ob-ein-string-eine-valide-asin-ist/(英文版)
答案 2 :(得分:1)
也许您可以查看亚马逊网站是否存在ASIN。
http://www.amazon.com/dp/YOUR10DIGITASIN
此URL在产品存在时返回http-statuscode = 200,如果不是有效的ASIN则返回404.
答案 3 :(得分:0)
“当产品存在时,此URL返回http-statuscode = 200,如果不是有效的ASIN,则返回404.”
这不起作用,因为根据文档,ASIN是特定于区域的(如果你不相信,请自行检查)。你只能在amazon.co.uk验证asin - 让我们说 - amazon.co.uk,所以你也必须知道ASIN的来源。
然而,在你的情况下,你最好有三个输入字段 - 每个搜索一个。或者(好多了)一个字段和三个单选按钮。或者,你可以检查一下字典中的字符串...但猜测也很糟糕。
此外,没有轻量级方法来检查asin的有效性
答案 4 :(得分: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开头)
答案 5 :(得分:-4)
您是否知道亚马逊提供的API(包括Amazon Associates Web服务)允许您以编程方式与Amazon进行交互。我怀疑这将解决你的问题(以某种方式)。查看Amazon Web Services主页以获取更多信息。