亚马逊短网址正则表达式...为什么我不能让这个工作

时间:2009-10-20 19:05:09

标签: php regex amazon short-url

这是我得到的一个正则表达式:一个我无法链接的博客,因为我是新的...只是谷歌亚马逊短网址并点击诺亚科德的博客文章

从这个页面可以看到......它应该从任何亚马逊网址中提取唯一的产品ID,这样你就可以缩短它...或者用它来从亚马逊apis中提取信息。

这是我试图使用它的示例代码:

<?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

非常感谢!这是我第一次在这个网站上发帖,我已经找到了无数的答案

在第二方面...收回我对这个痛苦的第一次提交过程的一些感谢...我不得不修改这个问题,因为它认为我的正则表达式模式是网址

2 个答案:

答案 0 :(得分:12)

你的正则表达式可能需要分隔符:一个将出现在它的开头和结尾的字符。 关于PHP手册的This comment感兴趣,关于此: - )

经常使用

'/';但有些人更喜欢“#” - 第二个人更喜欢网址

所以:

$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

答案 1 :(得分: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);

?>