Подтвердить что ты не робот

Очистить 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? Спасибо!

4b9b3361

Ответ 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.