-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/和之前的产品 ID。?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 将始终采用这种精确格式,还是应该与任何亚马逊 URL 匹配?

如果格式总是这样,那么您可以使用@cryptic 的答案。否则,使用类似模式的模式会更灵活|dp/([A-Z0-9]+)|i

这将匹配字符串中紧跟的任何字母数字字符串(不区分大小写)dp/。好吧,整个匹配将包括该dp/部分,但括号部分是一个子匹配,它将仅匹配产品 ID。


编辑:根据这个页面,亚马逊的产品 ID (ASIN) 可以出现在各种各样的 URL 中,这使得它们难以匹配,我上面的代码不会全部捕捉到它们。

尝试捕获这些的一种方法是使用parse_url提取 URL 的hostpath部分。从那里,您可以对照已知的 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
}
于 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 回答