我有一个亚马逊链接:
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
我希望使用正则表达式或任何可以提取它的东西。
网址的链接是静态的,不会改变。
答案 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
来提取网址的host
和path
部分。从那里,您可以根据已知的亚马逊域名检查主机部分,并且可以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