2013-01-24 59 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