-1

アマゾンのリンクがあります:

http://www.amazon.com/Pampers-Softcare-Fresh-Wipes-Count/dp/B007KXO998/ref=pd_zg_rss_ts_165796011_165796011_7?ie=UTF8&tag=elson06-20

正規表現またはそれを抽出できるものを使用して取得したい前後の製品IDB007FHX9OKを取得しようとしています。dp/?ref=pd_zg_rss_ts_165796011_165796011_7

URL のリンクは静的であり、変更されません。

4

3 に答える 3

3
$string = 'http://www.amazon.com/iOttie-Windshield-INCREDIBLE-BlackBerry-Revolution/dp/B007FHX9OK?SubscriptionId=AKIAJJPPYQPVMQLOYLKQ&tag=elson06-20&linkCode=sp1&camp=2025&creative=165953&creativeASIN=B007FHX9OK';
//$string = 'http://www.amazon.com/Pampers-Softcare-Fresh-Wipes-Count/dp/B007KXO998/ref=pd_zg_rss_ts_165796011_165796011_7?ie=UTF8&tag=elson06-20';

$pid = basename((false !== strpos($string, '/ref='))
    ? pathinfo($string, PATHINFO_DIRNAME)
    : parse_url($string, PHP_URL_PATH));

echo $pid; // Outputs B007KXO998 or B007FHX9OK, will work for both types of URLs

正規表現は必要ありません。PHP には URL を解析する組み込み関数があります。

于 2013-01-24T07:20:09.333 に答える
0

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 桁のバージョンがあります (使用しているという証拠はありませんが)。hostpathexplode

これは、私が完全にテストしていない非常に基本的な例です。

$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
}
于 2013-01-24T07:26:34.280 に答える
-1

リンクの形式は常に同じであると確信しているため、次のようにしました。

$link = 'http://www.amazon.com/Pampers-Softcare-Fresh-Wipes-Count/dp/B007KXO998/ref=pd_zg_rss_ts_165796011_165796011_7?ie=UTF8&tag=elson06-20'
$link = parse_url($link);
$link = explode('/',$link['path']);
$link = $link[3];
echo $link; //B007KXO998
于 2013-01-24T07:52:26.573 に答える