PHPでAmazonのURLからASINを抽出する
AmazonのURLからASINだけを抽出したいなぁ~という要件が出てきたのでPHPで作ってみました。
単なる文字列操作のサンプルコードです。
Amazon URLの例
https://www.amazon.co.jp/dp/4798030937/
ASINとはこの10桁の赤字の部分で、Amazonのすべての商品には必ずこのIDが振られています。
Amazonのアフィリエイトリンクを貼っているサイトなら、AmazonのPAAPIを使ってそのサイト独自の商品データベースを提供したり、アレコレ情報をまとめたページを作ったりするかと思いますが、PAAPIにはリクエストの回数制限があります。
そのため、一時的にリクエスト結果をキャッシュしてリクエスト回数を減らす等の工夫をしているWebサイトもあることでしょう。
例えば、以前投稿した「Amazonの商品検索ウィジェットが文字化けするので自作してみた part3」などが1つの例です。
そうして出来上がった自前のデータベース(キャッシュ)から検索するとき、あるいはユーザーが入力したAmazonのURLからASINだけを抜き出したい、といった要件が出てくるかと思います。
今回はこの要件をPHPで実現してみます。
AmazonのURLからstrposでASINを抽出する例
サンプルコード
function getASIN($url)
{
$pathArray = array('/dp/', '/product/');
foreach ($pathArray as $path) {
if (($pos1 = strpos($url, $path)) !== false) {
$pos1 += strlen($path);
if (($pos2 = strpos($url, '/', $pos1)) !== false) {
return substr($url, $pos1, $pos2-$pos1);
}
}
}
return '';
}
解説
………なんかすんません…泥臭い感じで…。
正規表現のほうが美しく書けるんですけど、速度比較したらこっちのstrpos使った関数のほうが早かったので先に掲載しておこうかな、と。
やってることは単純でURLの中から /dp/ もしくは /product/ に一致する部分を探し、その次に現れるスラッシュまでの部分を切り取って返しています。
一応、ASINのルール的には10文字と決まっているようなので、$pos2 = strpos($url, '/', $pos1) というようにわざわざスラッシュを検索せずに10文字と決め打ちで切り取っても良いのですが、Amazonの仕様変わったら面倒ですしね。別段難しいコードでもないし、速度も誤差レベルでしか変わらなかったので、最後のスラッシュまで検索しています。
AmazonのURLから正規表現でASINを抽出する例
サンプルコード
function getASIN($url)
{
if (preg_match('/\/(dp|product)\/(.+)\//', $url, $matches)) {
return $matches[2];
} else {
return '';
}
}
解説
やってることはstrposのときと同じで /dp/ もしくは /product/ からはじまり、スラッシュで終わる文字列をASINと判断して取得しています。
個人的には正規表現って苦手で、しばらくするとすぐに書き方を忘れてしまうのでstrposのほうが好きですw
速度比較
先に答えを書いてしまいましたが、strposのほうがほんのすこ~~~しだけ早いです。
■Core i3のPCで100万回ASIN取得を実行した結果
strpos | 0.33838486671448sec. |
正規表現 | 0.38117098808289sec. |
100万回実行して0.05秒しか変わりません。
こんなん好みで選んで良いと思う。
多くの人は正規表現のほうがコード量が少なくて見やすいんじゃないかしら。ぼくは断固としてstrposだけれどw
まとめ
ユーザーが任意に入力したAmazonのURLを解析してASINを取得し、キャッシュに持っている商品画像を表示するような仕組みを作りたいなぁーと思いたち、PHPでAmazon URLからASINを抽出する関数を作ってみました。
正規表現のほうが少ないコードで済むし、速度的にも早いだろうなぁーと思いつつ、一応strposとの速度比較をしてみましたが、予想外にstrposのほうが早かったので、ぼくとしてはそちらを採用。
でも、たぶん一般的には正規表現のほうが好まれると思うよ!
…というお話でした。