2013-01-24 60 views
-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 

我试图让产品ID B007FHX9OKdp/后和之前?ref=pd_zg_rss_ts_165796011_165796011_7 我想,使用正则表达式或任何可以提取它的东西。

url的链接是静态的,它不会改变。

+0

这样的事情dp /(.*)?SubscriptionId = – senK

回答

-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 
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

哇!这太快了!我不知道我们可以使用那个。我仍然在我所有的可能的链接上进行测试。 – PinoyStackOverflower

+0

这假设路径将始终采用相同的格式,并且产品ID始终是路径部分的最后部分。亚马逊使用了一堆不同的路径,产品ID并不总是路径的最后一部分。 – AgentConundrum

+1

@AgentConundrum如果你是对的,那么即使是正则表达式也不可靠,因为它可能会改变,以及'dp /'可能不在产品ID之前。 –

0

这些网址是否始终采用此确切格式,还是会与任何亚马逊网址匹配?

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

这将匹配字符串中的dp/后面的任何字母数字字符串(不区分大小写)。那么,整场比赛将包括dp/部分,但括号内的部分是仅匹配产品ID的子比赛。


编辑:据this page,亚马逊的产品ID(ASINs)可以存在于各种各样的网址,使它们难以企及,而我上面的代码将无法赶上他们。

试图捕获这些内容的一种方法是使用parse_url来提取URL的hostpath部分。从那里,您可以根据已知的Amazon域名检查主机部分,并且您可以路径为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 
} 
+0

你的问题的答案是它会匹配任何亚马逊网址。我想获取产品ID。我在Regex绝对是noob,你能告诉我怎么做那个?谢谢! :) – PinoyStackOverflower

+0

@ElsonSolano这是我的答案中的模式已经做了,假设它总是直接在'dp /'之后,这显然是一个糟糕的假设 - [本页](https://en.wikipedia.org/wiki/Amazon_Standard_Identification_Number)显示许多不同的URL表单。我会尽力更新我的答案。 – AgentConundrum

+0

截至目前,让我们假设它始终在dp/ad之前?SubscriptionId = – PinoyStackOverflower