Очистить ASIN от URL amazon с помощью javascript
Предполагая, что у меня есть URL-адрес продукта Amazon, подобный этому
http://www.amazon.com/Kindle-Wireless-Reading-Display-Generation/dp/B0015T963C/ref=amb_link_86123711_2?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-1&pf_rd_r=0AY9N5GXRYHCADJP5P0V&pf_rd_t=101&pf_rd_p=500528151&pf_rd_i=507846
Как я мог очистить только ASIN с помощью javascript?
Спасибо!
Ответы
Ответ 1
Страницы подробностей Amazon могут иметь несколько форм, поэтому, чтобы быть внимательным, вы должны проверить их все. Все они эквивалентны:
http://www.amazon.com/Kindle-Wireless-Reading-Display-Generation/dp/B0015T963C
http://www.amazon.com/dp/B0015T963C
http://www.amazon.com/gp/product/B0015T963C
http://www.amazon.com/gp/product/glance/B0015T963C
Они всегда выглядят так или вот так:
http://www.amazon.com/<SEO STRING>/dp/<VIEW>/ASIN
http://www.amazon.com/gp/product/<VIEW>/ASIN
Это должно сделать это:
var url = "http://www.amazon.com/Kindle-Wireless-Reading-Display-Generation/dp/B0015T963C";
var regex = RegExp("http://www.amazon.com/([\\w-]+/)?(dp|gp/product)/(\\w+/)?(\\w{10})");
m = url.match(regex);
if (m) {
alert("ASIN=" + m[4]);
}
Ответ 2
Поскольку ASIN всегда представляет собой последовательность из 10 букв и/или цифр сразу после косой черты, попробуйте следующее:
url.match("/([a-zA-Z0-9]{10})(?:[/?]|$)")
Дополнительный (?:[/?]|$)
после ASIN должен гарантировать, что будет выполнен только полный сегмент пути.
Ответ 3
Собственно, верхний ответ не работает, если это что-то вроде amazon.com/BlackBerry... (так как BlackBerry тоже 10 символов).
Один способ обхода (при условии, что ASIN всегда заглавными, так как он всегда берется из Amazon) (в Ruby):
url.match("/([A-Z0-9]{10})")
Я нашел, что он работает с тысячами URL-адресов.
Ответ 4
Ни одно из указанных выше не работает во всех случаях. Я пробовал следующие URL-адреса, чтобы соответствовать приведенным выше примерам:
http://www.amazon.com/Kindle-Wireless-Reading-Display-Generation/dp/B0015T963C
http://www.amazon.com/dp/B0015T963C
http://www.amazon.com/gp/product/B0015T963C
http://www.amazon.com/gp/product/glance/B0015T963C
https://www.amazon.de/gp/product/B00LGAQ7NW/ref=s9u_simh_gw_i1?ie=UTF8&pd_rd_i=B00LGAQ7NW&pd_rd_r=5GP2JGPPBAXXP8935Q61&pd_rd_w=gzhaa&pd_rd_wg=HBg7f&pf_rd_m=A3JWKAKR8XB7XF&pf_rd_s=&pf_rd_r=GA7GB6X6K6WMJC6WQ9RB&pf_rd_t=36701&pf_rd_p=c210947d-c955-4398-98aa-d1dc27e614f1&pf_rd_i=desktop
https://www.amazon.de/Sawyer-Wasserfilter-Wasseraufbereitung-Outdoor-Filter/dp/B00FA2RLX2/ref=pd_sim_200_3?_encoding=UTF8&psc=1&refRID=NMR7SMXJAKC4B3MH0HTN
https://www.amazon.de/Notverpflegung-Kg-Marine-wasserdicht-verpackt/dp/B01DFJTYSQ/ref=pd_sim_200_5?_encoding=UTF8&psc=1&refRID=7QM8MPC16XYBAZMJNMA4
https://www.amazon.de/dp/B01N32MQOA?psc=1
Это лучшее, что я мог бы придумать: (?:[/dp/]|$)([A-Z0-9]{10})
Который также будет выбирать предваряющие/во всех случаях. Затем это можно удалить позже.
Вы можете проверить его на: http://regexr.com/3gk2s
Ответ 5
@Gumbo: ваш код отлично работает!
//Тест JS: протестируйте его в firebug.
url = window.location.href;
url.match("/([a-zA-Z0-9]{10})(?:[/?]|$)");
Я добавляю функцию php, которая делает то же самое.
function amazon_get_asin_code($url) {
global $debug;
$result = "";
$pattern = "([a-zA-Z0-9]{10})(?:[/?]|$)";
$pattern = escapeshellarg($pattern);
preg_match($pattern, $url, $matches);
if($debug) {
var_dump($matches);
}
if($matches && isset($matches[1])) {
$result = $matches[1];
}
return $result;
}
Ответ 6
это моя универсальная амазонка ASIN regexp:
~(?:\b)((?=[0-9a-z]*\d)[0-9a-z]{10})(?:\b)~i
Ответ 7
Это может быть упрощенным подходом, но мне еще предстоит найти ошибку в нем, используя любой из URL-адресов, представленных в этой теме, которые, по мнению людей, являются проблемой.
Просто я беру URL, разбиваю его на "/", чтобы получить отдельные части. Затем переберите содержимое массива и отразите его от регулярного выражения. В моем случае переменная я представляет объект, у которого есть свойство с именем RawURL, содержащее необработанный URL-адрес, с которым я работаю, и свойство с именем VendorSKU, которое я заполняю.
try
{
string[] urlParts = i.RawURL.Split('/');
Regex regex = new Regex(@"^[A-Z0-9]{10}");
foreach (string part in urlParts)
{
Match m = regex.Match(part);
if (m.Success)
{
i.VendorSKU = m.Value;
}
}
}
catch (Exception) { }
Пока что это сработало отлично.
Ответ 8
что-то вроде этого должно работать (не проверено)
var match = /\/dp\/(.*?)\/ref=amb_link/.exec(amazon_url);
var asin = match ? match[1] : '';
Ответ 9
Статья Википедии об ASIN (которую я связал в вашем вопросе) дает различные формы URL-адресов Amazon. Вы можете довольно легко создать регулярное выражение (или ряд из них) для извлечения этих данных с помощью метода match()
.
Ответ 10
Небольшое изменение в регулярном выражении первого ответа, и оно работает на всех URL, которые я проверял.
var url = "http://www.amazon.com/Kindle-Wireless-Reading-Display-Generation/dp/B0015T963C";
m = url.match("/([a-zA-Z0-9]{10})(?:[/?]|$)");;
print(m);
if (m) {
print("ASIN=" + m[1]);
}
Ответ 11
Вы можете получить номер ASIN, получив/очистив содержимое этой страницы, а затем получив значение элемента по id = "ASIN". Это будет работать во всех случаях, и вам не нужно полагаться на регулярные выражения.
![enter image description here]()
Ответ 12
Это отлично сработало для меня, я перепробовал все ссылки на этой странице и некоторые другие ссылки:
function ExtractASIN(url){
var ASINreg = new RegExp(/(?:\/)([A-Z0-9]{10})(?:$|\/|\?)/);
var cMatch = url.match(ASINreg);
if(cMatch == null){
return null;
}
return cMatch[1];
}
ExtractASIN('http://www.amazon.com/Kindle-Wireless-Reading-Display-Generation/dp/B0015T963C/ref=amb_link_86123711_2?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-1&pf_rd_r=0AY9N5GXRYHCADJP5P0V&pf_rd_t=101&pf_rd_p=500528151&pf_rd_i=507846');
- Я предположил, что ASIN представляет собой 10-длину с заглавными буквами и цифрами
- Я предположил, что после ASIN должно быть: конец ссылки, знак вопроса или косая черта
- Я предположил, что перед ASIN должен быть слеш
Ответ 13
Если ASIN всегда находится в этой позиции в URL-адресе:
var asin= decodeURIComponent(url.split('/')[5]);
хотя, вероятно, мало шансов на получение ASIN% -scaped.