読者です 読者をやめる 読者になる 読者になる

備忘録

なんとなく暇なときにでも....

楽天の商品検索APIで詰まってしまった話

php

楽天の商品検索APIを使って、指定したキーワードを用いて楽天市場に出回っている商品を検索するツールを受託で開発しました。
その際に、ある問題で1時間ほどハマってしまいましたので、共有できればと思います。

まず楽天の商品検索APIについてですが、導入や使い方については割愛させていただきます。
(実際に使用したAPIはこちらです。↓)
webservice.rakuten.co.jp
一旦は開発しまして、クライアントさんに納品したのですが、あるキーワードを入力するとバグが出るとのこと。
そのワードとは........

「半角1文字」


再度上記のAPIの仕様書を読んでみますと、

各検索キーワードは半角2文字 もしくは 全角1文字 以上で指定する必要があります。

との記述が...
完全に見落としてました。

じゃあいったい半角英数字を入力したい場合はどうすればよいのか...
「そもそも、半角1文字で検索するシチュエーションなんてほとんどないわけだし、気にしなくていいのでは?」とも思いましたが、
どうやら半角1文字だけでなく、「i can fly」のようにスペースを空けて半角1文字を使用した場合でも、駄目だという。

f:id:tomAn:20161008182900j:plain

( i , can , fly の3つワードのアンド検索になっているのでしょう。 )

どうしたものかと考えていましたが、ふと実際に楽天で同様の条件で検索したらどうなるのだろうと思いまして、「i can fly」で検索してみたところ、「i+can+fly」のように検索を行っているようです。

f:id:tomAn:20161008183120p:plain

なので、これを踏襲することとし、
目標としては、単語の羅列の中から1文字の単語が来たら、その後ろのスペースを"+"に変換することにしました。

手順としては、

1. 単語の羅列の中に含まれる全角スペースを半角スペースに変換(preg_replace)

2. 半角スペースをデリミタにして、各単語を配列の格納(preg_split)

3. 各単語の文字数をカウントし、もし1文字だったら、後ろに"+"を付ける。(念のため、ひらがな1文字の場合も1文字とカウントするためmb_strlenを使用しました。)

4. 配列の最後までチェックが終わったら、配列の要素(単語)同士を結合して、元の文字列に戻す。

こんな感じでなんとか「i+can fly」というキーワードに変換することができました。


本日はここまで。

参考サイト

web-dou.com

unskilled.site

[ PHP ] 正規表現サンプル12選 ( preg_match / preg_match_all) – 行け!偏差値40プログラマー

ysklog.net

mb_strlen:文字列の文字数をカウントする

追記

よくよく考えてたら、スペースをpreg_replaceで全て"+"にすればよかっただけの話でしたな。