PHP – 文字列中から特定の部分を切り出す(preg_match)

前回の記事では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が入っています!(*´∀`*)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です