URL は常にこの正確な形式になりますか、それとも任意の Amazon URL と一致することが期待されますか?
フォーマットが常にこのようになる場合は、@cryptic の回答を使用できます。それ以外の場合は、パターンのようなパターンを使用する方がより柔軟|dp/([A-Z0-9]+)|i
です。
これは、文字列の直後に続く任意の英数字文字列 (大文字と小文字を区別しない) に一致dp/
します。全体の一致にはそのdp/
部分が含まれますが、括弧で囲まれた部分は製品 ID のみに一致するサブ一致です。
編集:このページによると、Amazon の製品 ID (ASIN) はさまざまな URL に存在する可能性があるため、それらを一致させるのは難しく、上記のコードはそれらすべてをキャッチすることはできません。
これらをキャッチしようとする 1 つの方法は、 を使用して URL のと の部分parse_url
を抽出することです。そこから、既知の Amazon ドメイン名に対してホスト部分を確認し、パスを確認して、10 文字の長さの英数字セクションの各部分を確認できます。それでも、書籍の ASIN は書籍の ISBN であり、場合によっては Amazon が使用する可能性のある 13 桁のバージョンがあります (使用しているという証拠はありませんが)。host
path
explode
これは、私が完全にテストしていない非常に基本的な例です。
$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
}