这些网址是否始终采用此确切格式,还是会与任何亚马逊网址匹配?
如果格式总是这样,那么你可以使用@神秘的答案。否则,使用|dp/([A-Z0-9]+)|i
这样的模式会更灵活。
这将匹配字符串中的dp/
后面的任何字母数字字符串(不区分大小写)。那么,整场比赛将包括dp/
部分,但括号内的部分是仅匹配产品ID的子比赛。
编辑:据this page,亚马逊的产品ID(ASINs)可以存在于各种各样的网址,使它们难以企及,而我上面的代码将无法赶上他们。
试图捕获这些内容的一种方法是使用parse_url
来提取URL的host
和path
部分。从那里,您可以根据已知的Amazon域名检查主机部分,并且您可以路径为explode
,并检查每个部分的长度为10个字符的字母数字部分。即使那样,书籍的ASIN就是书籍ISBN,并且在一些情况下有亚马逊可能使用的13位版本(尽管我没有证据证明它们是这样做的)。
这是一个非常简单的例子,我还没有彻底测试:
$url = get_url_from_wherever();
$url_parts = parse_url($url);
$host = $url_parts['host'];
$path = explode('/', $url_parts['path']);
$amazon_hosts = array(
'amazon.com', // United States
'amazon.ca', // Canada
'amazon.cn', // China
'amazon.fr', // France
'amazon.it', // Italy
'amazon.de', // Germany
'amazon.es', // Spain
'amazon.co.jp', // Japan
'amazon.co.uk', // United Kingdom
'amzn.to' // URL Shortener
);
$amazon_hosts = array_map('preg_quote', $amazon_hosts);
$asin = FALSE; // initialize in case we don't find the ASIN
if (preg_match('/(^|\.)(' . implode($amazon_hosts, '|') . ')$/i', $host)) {
// valid host
foreach($path as $path_component) {
if (preg_match('/^[A-Z0-9]{10}$/i', $path_component)) {
// this is probably the ASIN, since the string is a 10-character alphanumeric
$asin = $path_component;
}
}
}
if ($asin) {
// process ASIN
} else {
// couldn't find an ASIN in this URL
}
这样的事情dp /(.*)?SubscriptionId = – senK