使用REGEX获取字符串的一部分

时间:2013-01-24 07:16:07

标签: php regex

我有一个亚马逊链接:

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

我正在尝试获取B007FHX9OK之后dp/之前的产品ID ?ref=pd_zg_rss_ts_165796011_165796011_7 我希望使用正则表达式或任何可以提取它的东西。

网址的链接是静态的,不会改变。

3 个答案:

答案 0 :(得分: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的内置函数。

答案 1 :(得分:0)

网址是否始终采用这种格式,或者是否可以匹配任何亚马逊网址?

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

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


编辑:根据this page,亚马逊的产品ID(ASIN)可能存在于各种各样的网址中,这使得它们很难匹配,而我上面的代码也无法全部捕捉到它们。

尝试捕获这些内容的一种方法是使用parse_url来提取网址的hostpath部分。从那里,您可以根据已知的亚马逊域名检查主机部分,并且可以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
}

答案 2 :(得分:-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