亚马逊短网址正则表达式...为啥我不能让它工作

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);

?>

【讨论】:

也感谢您提供了一个很棒的答案.. 并随时包含在我上面为第一个答案写的评论中。

以上是关于亚马逊短网址正则表达式...为啥我不能让它工作的主要内容,如果未能解决你的问题,请参考以下文章

外向英国邮政编码的 Python 正则表达式

如何在正则表达式中应用条件

没有标记就不能清理网络爬虫吗?用正则表达式是否不能让它干净?

为啥我不能使用 warnings.filterwarnings 使用正则表达式来抑制警告

为啥我不能使用正则表达式来评估 if...else 语句 [重复]

为啥我的带有 ^ 的 Emacs 正则表达式不能匹配行的开头?