亚马逊短网址正则表达式...为啥我不能让它工作
Posted
技术标签:
【中文标题】亚马逊短网址正则表达式...为啥我不能让它工作【英文标题】:amazon short url regex... why can't i get this to work亚马逊短网址正则表达式...为什么我不能让它工作 【发布时间】:2010-12-08 11:25:06 【问题描述】:这是我得到的一个正则表达式:一个我无法链接到的博客,因为我是新人......只需谷歌亚马逊短网址并点击 noah coad 的博客文章
正如您在此页面中看到的...它应该从任何亚马逊网址中提取唯一的产品 ID,以便您可以缩短它...或使用它从亚马逊 API 中提取信息。
这是我尝试使用的示例代码:
<?php
$example_url = 'http://www.amazon.com/dp/1430219483/?tag=codinghorror-20';
$reg = '(?:http://(?:www\.)0,1amazon\.com(?:/.*)0,1(?:/dp/|/gp/product/))(.*?)(?:/.*|$)';
echo 'test<br/>';
echo preg_match($reg,$example_url);
?>
这是我的输出:
test
Warning: preg_match() [function.preg-match]: Unknown modifier '(' in /Users/apple/Sites/amazon/asin_extract.php on line 14
非常感谢!这是我第一次在这个网站上发帖,我已经找到了无数的答案
二手...收回我对这个痛苦的第一次提交过程的一些感谢...我不得不修剪这个问题,因为它认为我的正则表达式模式是网址
【问题讨论】:
您可以将0,1
替换为?
。
【参考方案1】:
您的正则表达式可能需要分隔符:将出现在开头和结尾的字符。 This comment对PHP手册有兴趣,关于这个:-)
'/
'经常被使用;但有些人更喜欢 '#
' -- 第二个更适合 URL
所以:
$reg = '#(?:http://(?:www\.)0,1amazon\.com(?:/.*)0,1(?:/dp/|/gp/product/))(.*?)(?:/.*|$)#';
并且,使用完整的代码,稍作修改以捕获结果:
$example_url = 'http://www.amazon.com/Professional-Visual-Studio-System-Programmer/dp/0764584367/ref=sr_1_1/104-4732806-7470339?ie=UTF8&s=books&qid=1179873697&sr=8-1';
$reg = '#(?:http://(?:www\.)0,1amazon\.com(?:/.*)0,1(?:/dp/|/gp/product/))(.*?)(?:/.*|$)#';
echo 'test<br/>';
$matches = array();
echo preg_match($reg,$example_url, $matches);
var_dump($matches);
您从var_dump
得到的输出是:
array
0 => string 'http://www.amazon.com/Professional-Visual-Studio-System-Programmer/dp/0764584367/ref=sr_1_1/104-4732806-7470339?ie=UTF8&s=books&qid=1179873697&sr=8-1' (length=149)
1 => string '0764584367' (length=10)
而$matches[1]
是0764584367
。
【讨论】:
感谢您的精彩、简单和优雅的解释。甚至超越。这是一个很棒的社区,你就是一个光辉的榜样。 很棒的答案!我使用了一个稍微修改过的版本。首先,并非所有亚马逊产品都位于 amazon.com(还有其他***域名,以及 astore.amazon.com)。其次,ASIN 后面可以跟一个?在某些情况下。因此,我使用 "$reg = '#(?:(?:/dp/|/gp/product/|/detail/))(.*?)(?:/.*|\?.*|$ )#';"然后验证,我确保匹配的 ASIN 候选确实是 10 个字符长/exec/obidos/asin/
也有效,您可以添加到模式中。【参考方案2】:
看起来问题在于它试图使用括号作为开始/结束正则表达式分隔符。以下是手册页中的示例:
$pattern = '/^def/';
如果您使用斜杠作为开始/结束表达式的分隔符,那么编写正则表达式会很粗糙。我建议将井号 ('#') 用于正则表达式,因为您必须转义更少的字符。
这就是我最终得到的结果:
<?php
$example_url = 'http://www.amazon.com/Server-Side-Programming-Techniques-Performance-Scalability/dp/0201704293';
$reg = "#(?:http://(?:www\.)0,1amazon\.com(?:/.*)0,1(?:/dp/|/gp/product/))(.*?)(?:/.*|$)#";
echo 'test<br/>';
echo preg_match($reg, $example_url);
?>
【讨论】:
也感谢您提供了一个很棒的答案.. 并随时包含在我上面为第一个答案写的评论中。以上是关于亚马逊短网址正则表达式...为啥我不能让它工作的主要内容,如果未能解决你的问题,请参考以下文章
没有标记就不能清理网络爬虫吗?用正则表达式是否不能让它干净?
为啥我不能使用 warnings.filterwarnings 使用正则表达式来抑制警告