Php 用于匹配Amazon标记的正则表达式
我有下面的函数,它以下面的格式从Amazon URL提取数据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
$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()
实体)%.
- 然后使用
解析url。这将为您提供一个漂亮、干净的阵列。您将对parse_url()
的内容感兴趣query