前回の記事ではsubstr、strlen、strposを使って特定部分を切り出す、という内容をアップしましたが、「そんな原始的なことせんでええで」と師匠に言われてこちらの方法に切り替えました
preg_matchを使ったやり方の方がいいので、タイトルの実装をしたい場合はこちらを参考にしてもらえればと思います
preg_match
さっそくサンプルソースを見てみましょう
$target_text = array( "foo123456bar", "hoge234567fuga", "hogehoge234567fugafuga", "hoge01234567891fuga", "piyo345678hogera" ); foreach($target_text as $k=>$v){ if( preg_match("/^hoge([0-9]{1,10})fuga$/u", $v, $matches) ){ print $k; // 1 print $matches[0]; // hoge234567fuga print $matches[1]; // 234567 } }
今回の例ではどういう抽出をしているかというと
文字列の先頭が「hoge」で始まり、「fuga」で終わっていて、かつ、 その間には「1文字以上、10文字以下の数字のみ」あるモノを切り出します
では、解説していきます
正規表現の記述方法
preg_matchは1つ目の引数に正規表現を使った検索パターンを指定します
"/^hoge([0-9]{1,10})fuga$/u"
この部分ですね正規表現は”/ココ/u”に記述します、最後のuは修飾子といって、対象の文字列をutf-8として扱う場合に指定します
1つずつバラしていきましょう
正規表現の記述 | 説明 |
---|---|
^hoge | ^は文字列の先頭を意味します、^の直後にhogeが来ているので、文字列の先頭がhogeで始まることを表します |
([0-9]{1,10}) | ()は検索にマッチした場合、囲われている部分が第3引数の配列$matchesに入ります [0-9]は0から9までの数字を表しています、そしてその後ろの{1,10}が直前の文字列を1から10回繰り返すという意味で、つまりは1文字以上、10文字以下の数字のみを示します |
fuga$ | $は文末を意味します、fugaの直後に$が来ているので、文字列がfugaで終わることを表します |
他にも数多くの指定方法があるので、詳しくはググってみてください(๑˃̵ᴗ˂̵)و
サンプルの検索パターン
これを踏まえてサンプルの$target_textを見ていきますと、
key | value | 正規表現のマッチ具合 |
---|---|---|
0 | foo123456bar | そもそもhogeで始まっていないし、fugaで終わっていませんのでマッチせず |
1 | hoge234567fuga | hogeで始まり、fugaで終わっています。そして間には6文字の数字のみ、マッチします |
2 | hogehoge234567fugafuga | hogeで始まり、fugaで終わっています。が、間には数字のみではなく、余計なhogeとfugaが入っているのでマッチしません |
3 | hoge01234567891fuga | hogeで始まり、fugaで終わっていて、間には数字のみですが、数字は11文字あるのでマッチしません |
4 | piyo345678hogera | そもそもhogeで始まっていないし、fugaで終わっていませんのでマッチせず |
となり、サンプルの正規表現とマッチするのはkeyが1のhoge234567fugaのみとなります!
そして最後の抽出ですが、パターンにマッチした場合は第3引数の配列に結果が渡されます
$matchesの部分ですね
$matchesの0番目には、そもそもの検索対象文字列全てが入ります
そして以降には()で囲った中身が渡されます
今回の場合は()が1つのみです、matches[1]には234567が入っています!(*´∀`*)