This should work:
preg_match_all('#http://www.amazon.com/([\w-]+/)?(dp|gp/product)/(\w+/)?(\w{10})#', $data, $matches);
When you use the JavaScript RegExp
constructor with a string, all backslashes have to be escaped with another backslash. This is not the case with PHP.
And normally you would use /
as the delimiter for the regex, but as in this case you have a lot of /
in your search string it is wiser to use some other delimiter so you don't have to escape every slash with a backslash. In this case I used the pound sign as a delimiter.