0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【使い分け】mb_substr()とpreg_match()

Posted at

初めに

生のPHPを使ってAPIから値を取得する課題を進めている中で、特に学びとなったことを覚えとして投稿
※PHPでAPIの取得方法は
こちらの記事
当時のツイート

※私の状況
・プログラミング学習歴:8か月(ほぼ独学)
・PHP学習歴:2か月

経緯

問題内容

たくさんの猫の情報が詰まっている、とあるAPIから以下のような条件で値を取り出す問題があった

・問題
**猫の品種(name)の末尾が"hair"で終わる品種(name)**の内、寿命(life_span)の最大値が一番大きい猫の品種(name)を表示

当初予定(mb_substr)

当初は、

猫の品種(name)の末尾が"hair"で終わる品種

と聞いた時
mb_substrを使って末尾だけが"hair"である猫の品種(name)に絞ればOK!」
と思い

mb_substr($json_arry["name"], -4)="hair"

の条件を見たす品種(name)を取得する予定でしたが、うまく狙った値が取り出せず、一度他の方法を考えることに。

修正案(preg_match)

他の方法を調べたところ、preg_match()を使った正規表現を見つけたので、こちらで実装することにした。
実は正規表現は書き方が複雑で少し避けがちであった関数でしたが、調べてみると

記述方法 用途 使用例
"/^~/" 冒頭にマッチ 文字列の冒頭が"~"で始まる文字列がマッチ
"/~$/" 文末にマッチ 文字列の文末が"~"で終わる文字列がマッチ
"/*.~/" 改行以外の任意の1文字にマッチ "* ~"や"*-~"などの文字列がマッチ
"/--[abc]--/" []内の任意の1文字にマッチする a,b,cいずれかを含む文字列がマッチ。[]内は英数字でも可。
...etc

ここで書いたのは一例です。
こんな形で用途が様々で便利だと実感しました。

今回は「末尾が"hair"」なので$を使用し

preg_match('/hair$/', $data_first['name']);

と記述。
無事狙い値を取得し、問題を解くことができました。

使い分け方

更に深堀りして学習。

一見、似た処理をするmb_substrpreg_matchですが、何が違うのかというと
mb_substr:「切り出し」た文字列の自体を取得
 ⇒返り値は"hair"など文字列の一部
preg_match:指定した文字列を「含む」か否か
 ⇒返り値はtruefalse

という使い分けになります。

最後に

学習始めたての方々にとってはもしかしたら
正規表現って書き方難しそうだし、できれば使いたくない…
と思うかもしれません。(かくいう、私もそんな風に思っていました…)

ですが、上記のように値を取得する際に便利なオプションがあります。
今後、上のオプションを用いた正規表現を使えそうであれば是非使ってみてください!
便利さを実感すると同時にコーディングの幅が広がると思います。

最後までご覧頂きありがとうございました!m(__)m

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?