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.