亚马逊短链接正则表达式...为什么我无法使其工作?

4
这里是一个正则表达式,我从一个博客上得到的,但因为我是新手无法链接...只需谷歌亚马逊短网址并点击Noah Coad的博客文章即可看到。
如您在此页面中所见...它应该从任何亚马逊网址中提取唯一产品ID,以便您可以缩短网址... 或使用它来获取亚马逊API的信息。
这是我正在尝试使用的示例代码:
<?php
$example_url = 'http://www.amazon.com/dp/1430219483/?tag=codinghorror-20';    

$reg = '(?:http://(?:www\.){0,1}amazon\.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

非常感谢!这是我第一次发布问题,我在这个网站上已经找到了无数答案。
然而,由于这个痛苦的首次提交过程,我不得不收回一些感谢。我不得不缩小我的问题,因为它认为我的正则表达式模式是URL。

你可以用“?”替换“{0,1}”。 - Gumbo
2个回答

12

你的正则表达式可能需要定界符:一个将在正则表达式开头和结尾出现的字符。
PHP手册中这条评论是关于这个问题的,很有趣 :-)

'/'经常被使用,但有些人更喜欢 '#' - 第二个字符在URL中比较好看

所以:

$reg = '#(?:http://(?:www\.){0,1}amazon\.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,1}amazon\.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


3
感谢您提供了一份棒极了、简明优雅的解释,更加感激您超出了期望。这是一个伟大的社群,您是其中闪耀的典范。 - jkatzer
太棒了!我使用稍微修改过的版本。首先,并非所有亚马逊产品都在amazon.com上(还有其他顶级域名,以及astore.amazon.com)。其次,在某些情况下,ASIN后面可以跟一个问号。因此,我使用“$reg = '#(?:(?:/dp/|/gp/product/|/detail/))(.?)(?:/.|?.*|$)#';”然后进行验证,确保匹配的ASIN候选人确实是10个字符长的。 - Mala
/exec/obidos/asin/也是有效的,你可以将其添加到模式中。 - Akam

0

看起来问题是它试图使用括号作为您的开始/结束正则表达式分隔符。这是来自手册页的示例:

$pattern = '/^def/';

如果您使用斜杠作为起始/结束表达式分隔符,编写正则表达式将会很困难。我建议使用井号(“#”)来表示正则表达式,因为您需要转义的字符更少。
这是我最终得出的结果:
<?php

$example_url = 'http://www.amazon.com/Server-Side-Programming-Techniques-Performance-Scalability/dp/0201704293';

$reg = "#(?:http://(?:www\.){0,1}amazon\.com(?:/.*){0,1}(?:/dp/|/gp/product/))(.*?)(?:/.*|$)#";

echo 'test<br/>';

echo preg_match($reg, $example_url);

?>

1
谢谢你的精彩回答,也欢迎在我为第一个回答所写的评论中加入。 - jkatzer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接