這些網址是否始終採用此確切格式,還是會與任何亞馬遜網址匹配?
如果格式總是這樣,那麼你可以使用@神祕的答案。否則,使用|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