Php 用于匹配Amazon标记的正则表达式

Php 用于匹配Amazon标记的正则表达式,php,regex,amazon,preg-match-all,Php,Regex,Amazon,Preg Match All,我有下面的函数,它以下面的格式从Amazon 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

我有下面的函数,它以下面的格式从Amazon 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"
}

第三个匹配返回空,即不匹配任何内容。如何匹配标签TestTag-20?

如果没有更多示例,我无法确定,但这就是它需要对示例链接执行的操作:

http:\/\/www.amazon.com\/([\w-]+\/)?(dp|gp\/product)\/(tag\w+)?(\w+\/)?(\w{10})(?:%[^%]+){3}%\w{2}([^%]+)
只是一个便条,你可能没有注意到,但是链接中有两个ASIN,你正在抓取第一个出现的ASIN,而不是最后一个


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

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

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

作为替代方案,可能不太容易出错且更干净:

  • 首先,用
    urldecode()
    解码字符串(这样你就可以去掉
    %.
    实体)
  • 然后使用
    parse_url()
    解析url。这将为您提供一个漂亮、干净的阵列。您将对
    query
    的内容感兴趣