こんばんわ。
いっつも同じことをやろうとして、結局わからずググって、結果・・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>
で名前をつけるのだ!
- 一致させるパターンの前に、
終わりのことば
いかがでしたでしょうか。
正規表現で一番使われて、かつ単純なパターンだと思うものを紹介してみました。
私はこれを今までよく理解せずに使っていたため、毎回ぐぐるという不毛な作業をして時間を食ってました。。
これを機に正規表現の苦手意識をなくして、バリバリ書けるようになっていきたいと思います!