URL 将始终采用这种精确格式,还是应该与任何亚马逊 URL 匹配?
如果格式总是这样,那么您可以使用@cryptic 的答案。否则,使用类似模式的模式会更灵活|dp/([A-Z0-9]+)|i
。
这将匹配字符串中紧跟的任何字母数字字符串(不区分大小写)dp/
。好吧,整个匹配将包括该dp/
部分,但括号部分是一个子匹配,它将仅匹配产品 ID。
编辑:根据这个页面,亚马逊的产品 ID (ASIN) 可以出现在各种各样的 URL 中,这使得它们难以匹配,我上面的代码不会全部捕捉到它们。
尝试捕获这些的一种方法是使用parse_url
提取 URL 的host
和path
部分。从那里,您可以对照已知的 Amazon 域名检查主机部分,还可以检查explode
路径,并检查每个部分是否有十个字符长的字母数字部分。即便如此,书籍的 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
}