116
100

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 5 years have passed since last update.

phpのpreg_matchで特定の文字列のあとの何かを抜き出す

Last updated at Posted at 2015-08-27

こんばんわ。
いっつも同じことをやろうとして、結局わからずググって、結果・・preg_matchが出てきて、とりあえずコピペでやり過ごしてきました。

でも!もうこんな繰り返しは嫌!時間の無駄!
ということで、実際の例題を使って、私がやってきた思考と共に理解を深めていこうと思います。

さっそく例題

まずは↓のようなURLを使ってみましょう。

http://example.com?name=riki&page=30&count=100

(問題)この中から、nameパラメータの値と、countパラメータの値を抜き出してください(preg_match)を使って。

まずはnameから抜き出してみる

私: nameパラメータはname=****ってなってるから、name=のあとの文字列を抜き出せればなんとかなりそうだよな・・
私: 確か文字列は\wだった気が・・じゃあこんなかんじかな?

<?php

$str = "http://example.com?name=riki&page=30&count=100";

preg_match('/name=\w/', $str, $match);

var_dump($match);
結果
array(1) {
  [0]=>
  string(6) "name=r"
}

私: おぅ・・・そうじゃないんだよな、、name=は欲しくないし、パラメータの値は1文字じゃなくて、次の&までほしいんだ
私: (ググる・・)なるほど。()で囲うとグルーピング出来て、そのグルーピングの中で一致したものを返してくれるのね!
私: あと、値が最初の1文字しか出ないのは、\wで1文字しか指定してないからかーじゃあ、1文字以上の繰り返し(+)を使ってみよう

いざ!!!

<?php

$str = "http://example.com?name=riki&page=30&count=100";

preg_match('/name=(\w+)/', $str, $match);

var_dump($match);
結果
array(2) {
  [0]=>
  string(9) "name=riki"
  [1]=>
  string(4) "riki"
}

おー期待どおり$match[1]にnameの値が取得出来たぞ!

第二回戦、countパラメータも抜き出してみる

私: 次は、countパラメータかーこれは、&count=に続く数字を抜き出せば行けそうや。nameの時のを応用して・・・っと

<?php

$str = "http://example.com?name=riki&page=30&count=100";

preg_match('/name=(\w+)&count=(\d+)/', $str, $match);

var_dump($match);
結果
array(0) {
}

私: え・・・nameすら一致しなくなった・・・
私: あーこれだと、name=xxxxcount=100とかじゃないと一致しないか。
私: 実際には、name=xxxとcount=100の間には何かしらの文字列が続いてるので・・これを実現するために、.*何かの文字列の0回以上の繰り返しを使ってみるか

いざ!

<?php

$str = "http://example.com?name=riki&page=30&count=100";

preg_match('/name=(\w+).*&count=(\d+)/', $str, $match);

var_dump($match);
結果
array(3) {
  [0]=>
  string(27) "name=riki&page=30&count=100"
  [1]=>
  string(4) "riki"
  [2]=>
  string(3) "100"
}

私: っしゃあ!!

私: でもあれだな・・$matchのキーが数字なのね。
私: なんかnameパラメータの値は$match['name']とか、countは$match['count']で取れると嬉しいよな・・
google: preg_match グループ 一致 名前で検索やで!
google: phpのマニュアルに、名前つきサブパターンってのがあったで!
私: OK!ぐーぐる!
私: なるほど・・(?P<name>\w)とかって書けば、一致した部分が$match['name']で抜け出せるようになるのね。
私: (はてな・・P・・小なり・・付けたい名前・・大なり!!で覚えるのだ)

名前付きで抜くようにしてみる

<?php

$str = "http://example.com?name=riki&page=30&count=100";

preg_match('/name=(?P<name>\w+).*&count=(?P<count>\d+)/', $str, $match);

var_dump($match);

結果
array(5) {
  [0]=>
  string(27) "name=riki&page=30&count=100"
  ["name"]=>
  string(4) "riki"
  [1]=>
  string(4) "riki"
  ["count"]=>
  string(3) "100"
  [2]=>
  string(3) "100"
}

っしゃー!!出来た!
これで楽勝や!

まとめ

  • 一致する部分を抜き出すには・・
    • ()グルーピングを使う!
  • 一致した配列に名前をつけるには・・
    • 一致させるパターンの前に、?P<hoge>で名前をつけるのだ!

終わりのことば

いかがでしたでしょうか。
正規表現で一番使われて、かつ単純なパターンだと思うものを紹介してみました。

私はこれを今までよく理解せずに使っていたため、毎回ぐぐるという不毛な作業をして時間を食ってました。。
これを機に正規表現の苦手意識をなくして、バリバリ書けるようになっていきたいと思います!

116
100
3

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
116
100

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?