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

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

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

4

2 回答 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

于 2009-10-20T19:09:06.403 回答
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);

?>
于 2009-10-20T19:11:58.510 回答