php 确定10位字符串是否有效Amazon ASIN

uz75evzq  于 2023-02-18  发布在  PHP
关注(0)|答案(4)|浏览(171)

我有一个10位数的字符串传递给我,我想验证它是一个有效的ASIN之前,做更多的处理和/或重定向。
我知道一个非ISBN ASIN将总是非数字和10个字符的长度
我只是想能够告诉如果项目正在传递是一个有效的ASIN或它只是一个搜索字符串后,我已经消除了它可能是一个ISBN。
例如,“SOUNDBOARD”是一个搜索项,而“B 000 J5 XS 3C”是一个ASIN,“1412775884”是一个ISBN。
有没有轻量级的方法来检查ASIN?

oyjwcjzk

oyjwcjzk1#

更新,2017年

@Leonid评论说他找到了ASIN BT00LLINKI
虽然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])\s*$/

或者,无需担心额外的空白或捕获:

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

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

  1. 10位ISBN,即9位数字+最后一个字符,该字符可以是数字或“X”。
    1.字母B后跟两位数字,再后跟七个ASCII范围的字母数字字符(字母字符为大写)。
    如果有人遇到了不符合这种模式的ASIN,请插话。实际上可能会有比这更严格的限制,但我不确定。非ISBN ASIN可能只使用字母字符的子集,但即使如此,他们也会使用其中的大多数字符。有些似乎比其他字符出现得更频繁,至少(K,Z,Q,W...)
vyswwuz2

vyswwuz22#

对于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;
}
kuarbcqp

kuarbcqp3#

也许你可以在亚马逊网站上查一下ASIN是否存在。
http://www.amazon.com/dp/YOUR10DIGITASIN
当产品存在时,此URL返回http-statuscode=200,如果不是有效的ASIN,则返回404。

zazmityj

zazmityj4#

在尝试了几个解决方案(包括投票最多的答案)后,它们在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|英国电信)[0-9A-Z]{8}美元/
/^ =开始
(?i)=不区分大小写
(B0|BT)=从B 0或BT开始
[0-9A-Z]=任何数字或字母
{8}允许= 8个数字或字母(在B 0或BT的+2之上)

相关问题