0

我有以下功能,可以从以下格式的亚马逊 URL 中提取数据。

$str = 'http://www.amazon.com/The-Philppines-Handbook-Information/dp/B00513G3S4%3FSubscriptionId%3DAKIAJHD5HZTGWIGUKABQ%26tag%3Dtestittag-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00513G3S4';

function extract_data($str) {
    $regex = '/http:\/\/www.amazon.com\/([\w-]+\/)?(dp|gp\/product)\/(tag\w+)?(\w+\/)?(\w{10})/';
    if(preg_match_all($regex, $str, $matches, PREG_PATTERN_ORDER)) {
        var_dump($matches[3]);
        var_dump($matches[5]);
    } else return -1;
}
extract_data($str);

我正在寻找 ASIN 和标签信息。我能够获取 ASIN,但在获取标签时遇到了麻烦。这是 $regex 中的第三个匹配项(第五个是 ASIN)。请让我知道我做错了什么。

我得到以下输出:

array(1) {
  [0]=>
  string(0) ""
}
array(1) {
  [0]=>
  string(10) "B00513G3S4"
}

第三场比赛返回空,即不匹配任何内容。如何匹配标签testittag-20

4

2 回答 2

1

如果没有更多示例,不能肯定地说,但这可以满足您对示例链接的要求:

http:\/\/www.amazon.com\/([\w-]+\/)?(dp|gp\/product)\/(tag\w+)?(\w+\/)?(\w{10})(?:%[^%]+){3}%\w{2}([^%]+)

请注意,您可能没有注意到它,但链接中有 2 个 ASIN,您正在抓取第一个出现的 ASIN,而不是最后一个。

请参阅演示以获得更好的视图。

于 2013-08-11T17:30:41.977 回答
1

请记住,URL 参数可能会按顺序更改,因此我什至不会一次对所有内容进行一些固定匹配。

相反,我会尝试匹配类似/(?:%3F|%26)([\w\-]+?)%3D([\w\-]*?)(?:%26|$)/. 如果您要查找所有匹配项,这应该会为您提供键/值对列表。

作为替代方案,可能更不容易出错且更清晰:

  • 首先,解码字符串urldecode()(这样你就可以摆脱%##实体)。
  • 然后用于parse_url()解析 URL。如手册中所述,这将为您提供一个漂亮而干净的数组。您将对query.
于 2013-08-11T17:30:48.460 回答