icon
icon

PHPのpreg_matchで正規表現によるマッチングする方法

プログラミング初心者向けにPHPのpreg_matchを使って正規表現によるパターンのマッチングをする方法について解説しています。正規表現を利用することで検索や置換の幅も広がるので、ぜひ使い方を覚えておきましょう。

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

今回は、preg_matchについて、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。

preg_matchを利用することで、文字列の検索や置換を行うことができます。

実務でも、preg_matchを利用した文字列の検索や置き換えを行う処理を実装するので、ぜひ学習してみてください。

 

目次

1時間でできる無料体験!

 

そもそもPHPについてよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まります。

 

preg_matchとは

preg_matchでは、ある文字列から正規表現で指定したパターンにマッチした文字列を検索できます。

パターンにマッチした場合は1を返し、マッチしなかったら0を返します。

例えば、検索対象の「これからphpを勉強します。」という文字列から、パターン「php」を検索すると1を返します。

一方、「ruby」を検索すると0を返します。

「php」の場合は文字列内にありますが、rubyはないのでこういった結果になります。

他にも大文字・小文字を区別せずにパターンにマッチさせることや、指定文字列が先頭にあるだけマッチさせることもできます。

 

正規表現とは

正規表現とは、文章中の特定文字を検索、置き換え、削除することができる文法です。

正規表現を利用する例として、文章中にある「,」という英文字のカンマを、「、」という日本語の読点に一括変換する場合などです。

その他にも、次のような使い方が可能です。

  • 〇〇〇から始まる文字列を検索したい
  • ×××で終わる文字列を▼▼▼に置き換えたい
  • 大文字で始まる英単語を検索したい
  • HTML内のcol-から始まり、そのあとは1~2桁の数字となっているコードを別のコードに置き換えたい
  • 全角と半角、両方のスペースを削除したい

正規表現には非常に多くの指定方法があり、正規表現だけで1冊の本を書くことができるほど非常に深い内容です。

まずは、基本的な使い方を、サンプルコードを利用して使っていきましょう。

 

 

大石ゆかり

正規表現で指定したパターンにマッチするかどうかって少し難しいですね。

田島悠介

そうだね。簡単に言うと、ある形式にマッチしているかどうかってことなんだ。

大石ゆかり

ある形式とは何ですか?

田島悠介

例えばメールアドレスの形式になっているかどうかだったり、電話とか日付でもいいね。そういう単純には表せないものに使うんだよ。書き方を見てみよう!

 

[PR] PHPプログラミングで挫折しない学習方法を動画で公開中

preg_matchの書き方

preg_matchの書式は以下の通りです。

[ ]はオプションで省略できます。

preg_match(/正規表現パターン/,検索対象の文字列,[配列],[動作フラグ],[検索開始位置])

 

返り値

preg_match関数の返り値は、パターンにマッチすれば1、マッチしなければ0です。

返り値の部分に変数を指定することで、パターンマッチの結果である1か0が代入されます。

 

正規表現パターン

「正規表現パターン」でマッチさせたいパターンを指定します。

正規表現は/で囲んで記述します。

 

検索対象の文字列

「検索対象の文字列」では、正規表現でマッチさせる対象文字列です。

 

配列

「配列」を指定した場合は、検索結果が配列として代入されます。

 

動作フラグ

「動作フラグ」で「PREG_OFFSET_CAPTURE」を指定すると、マッチした文字列の登場した位置(オフセット)をバイト数で取得できます。

 

検索開始位置

「検索開始位置」では、先頭ではなく検索を始めたい位置を指定できます。

ただし、指定はバイト数なので注意が必要です。

 

コラム

コスパとタイパ、両方結果的に良くなる良くなる学び方とは?

「スクールは高いし時間も縛られて効率が悪い」と考える方は多いと思います。
もちろん、時間も費用もかかることは間違いありません。
ただ 結果的に無駄な学びにお金も時間もかける方がリスクが高いという考えもあります。

コスパ・タイパ最適化の参考として、 テックアカデミー卒業生がスクールを選んだ理由 をご紹介します。

  • ・困ったときに、質問や相談できる相手がいるため挫折しなかった
  • ・プロとして必要なスキルのみを深く学べたので無駄がなかった
  • ・副業案件の提供と納品までのサポートがあったので目的を達成できた

安価・短期間で広く浅く学んでも意味がありません。 本当に自分の目的が達成できるか、それが重要です。
自分にどのスキルや学び方が合っているか、どんな学習方法かなど、お気軽に 無料相談 に参加してみませんか?

カウンセラー・現役のプロへ、何でも気軽に無料相談可能。 30分か60分お好きな時間が選べて、かつ3回まで すべて無料で ご利用できます。
無理な勧誘は一切ない ので、お気軽にご参加ください。

今なら相談した方限定の割引・参加特典付き! 無料相談はこちら

実際に書いてみよう

それでは実際に、preg_match関数を使用してPHPのプログラムを書いてみましょう。

 

文字列「PHP」を検索する

以下は、文字列「PHP」にマッチするか確認しています。

サンプルコード

<?php
  if (preg_match("/PHP/", "今PHPを勉強しています。")) {
    echo "マッチしました。";
  } else {
    echo "マッチしませんでした。";
  }

出力結果

解説

<?phpでは、PHPプログラムを開始することを意味します。

if (preg_match(“/PHP/”, “今PHPを勉強しています。”)) {では、preg_matchを利用して、今PHPを勉強しています。という文字列からPHPという文字列がパターンマッチするかどうかを調査しています。

if文で、もし適合していたらという条件分岐を行っています。

echo “マッチしました。”;では、if文の条件に合致したら、マッチしました。と表示しています。

} else {では、if文の条件に合致しない場合の条件を指定しています。

echo “マッチしませんでした。”;では、if文の条件に合致しない場合、マッチしませんでした。と表示しています。

}ではif文の処理を終了します。

 

文字列「PHP」を大文字、小文字を区別せずに検索する

以下では、大文字・小文字の区別をせずにマッチするか確認しています。

これは、preg_matchの/正規表現パターン/の最後にアルファベットのiを記載することで、大文字、小文字を区別せずに検索します。

サンプルコード

<?php
  if (preg_match("/PHP/i", "今phpを勉強しています。")) {
    echo "マッチしました。";
  } else {
    echo "マッチしませんでした。";
  }

出力結果

解説

<?phpでは、PHPプログラムを開始することを意味します。

if (preg_match(“/PHP/”, “今phpを勉強しています。”)) {では、preg_matchを利用して、今phpを勉強しています。という文字列からPHPという文字列がパターンマッチするかどうかを調査しています。

if文で、もし適合していたらという条件分岐を行っています。

echo “マッチしました。”;では、if文の条件に合致したら、マッチしました。と表示しています。

} else {では、if文の条件に合致しない場合の条件を指定しています。

echo “マッチしませんでした。”;では、if文の条件に合致しない場合、マッチしませんでした。と表示しています。

通常、大文字のPHPで文字列を検索し、検索対象にはphpという文字列の場合は、マッチしませんでした。と表示されます。

今回は、preg_matchの/正規表現パターン/の最後にアルファベットのiを記載することで、大文字、小文字を区別せずに検索しています。

最終的に、PHPという文字列を検索して、大文字小文字を区別しないため、phpという文字列が検索対象になり、マッチしました。と表示しています。

}ではif文の処理を終了します。

 

文字列「PHP」を検索し、登場位置も取得する

ここでは、文字列「PHP」を検索し、登場位置も取得する処理をします。

サンプルコード

<?php
  if (preg_match("/PHP/", "今PHPを勉強しています。",$data,PREG_OFFSET_CAPTURE)) {
    echo "マッチしました。";
  } else {
    echo "マッチしませんでした。";
  }
  print_r($data)

出力結果

解説

<?phpでは、PHPプログラムを開始することを意味します。

if (preg_match(“/PHP/”, “今PHPを勉強しています。”,$data,PREG_OFFSET_CAPTURE)) {では、if文で、もし適合していたらという条件分岐を行っています。

preg_matchを利用して、今PHPを勉強しています。という文字列からPHPという文字列がパターンマッチするかどうかを調査しています。

$dataでは、配列データとして$dataに検索結果を代入します。

PREG_OFFSET_CAPTUREでは、PREG_OFFSET_CAPTUREを指定することで、各マッチに対応する文字列のオフセットが返されます。

オフセットとは、基準値からどれぐらい離れているかを意味します。

今回、「今PHPを勉強しています。」という文字列の基準値は、最初にある「今」という文字の直前です。

「今」という文字は日本語文字で、2バイトの長さがあります。

つまり、「今PHP」という文字列の「PHP」という文字の始まりは3バイト目です。

最終的に、$data配列には、検索対象のPHPという値が最初のインデックスである、0番目の配列に格納されます。

オフセットである3バイトの3が、次のインデックスである1番目の配列に格納されます。

インデックスというのは、配列において値を代入する位置を指定している番号です。

echo “マッチしました。”;では、if文の条件に合致したら、マッチしました。と表示しています。

} else {では、if文の条件に合致しない場合の条件を指定しています。

echo “マッチしませんでした。”;では、if文の条件に合致しない場合、マッチしませんでした。と表示しています。

}ではif文の処理を終了します。

print_r($data)では、$dataに入っている配列を表示しています。

表示結果は次の通りです。

(
    [0] => Array
        (
            [0] => PHP
            [1] => 3
        )
)

 

正規表現を使う関数

正規表現を使う関数には、次のようなものもあります。

  1. preg_quote()
  2. preg_match_all()
  3. preg_replace()
  4. preg_split()
  5. preg_last_error()
  6. preg_last_error_msg()

順番に紹介します。

 

preg_quote()

preg_quote($str, ‘/’)のようにして利用します。

preg_quote() では、str を引数として利用し、正規表現の特殊文字の前にバックスラッシュを挿入できます。

preg_quote() は、実行時に生成される文字列に、正規表現の特殊文字を含む場合のパターンマッチする場合に有効です。

preg_match_all()

preg_match_all($pattern,$subject,&$matches,$flags,$offset)という引数を利用して、繰り返しパターンマッチ処理を行えます。

preg_replace()

preg_replace($pattern, $replacement, $string);のようにして、$stringというデータに対し、$patternという正規表現パターンを利用して、 $replacementという置き換え後の文字列に変換できます。

preg_split()

preg_split ( パターン文字列 , パターンで区切る対象文字列[, 分割リミット数 = -1 [, フラグオプション = 0 ]] )のようにして、パターンマッチした文字列を区切ります。

PHPのsplit関数で文字列を分解して配列で返す方法  を参考にしてみてください。

preg_last_error()

preg_last_error()では、直近のPCRE 形式 正規表現処理のエラーコードを返します。

preg_last_error_msg()

preg_last_error_msg()では、最後に実行した PCRE 形式正規表現に関するエラーメッセージを返します。

 

1時間でできる無料体験!

おわりに

preg_matchで正規表現を使うと、様々な条件に一致させることができます。

今回の例以外に、郵便番号や電話番号にマッチさせることができます。

ぜひこの機会にpreg_matchで正規表現を使ってみましょう。

PHPの配列の基本を解説した記事も参考にしてみてください。

 

大石ゆかり

単純な文字列があるかどうか、の判定をしていますけど、PHPという文字列があるって、ちゃんと出てますねー。

田島悠介

文字列かあるかどうかっていう判定もできるんだ。本当は正規表現を使うものに対してpreg_match関数を使った方がいいんだ。

大石ゆかり

正規表現って難しそうですね。

田島悠介

簡単ではないよね。ただ、少しずつ慣れていけば大丈夫。とりあえずpreg_match関数があって、正規表現のパターンでマッチするかどうかを判断できるって覚えておけばいいよ。

 

PHPを学習中の方へ

これで解説は終了です、お疲れさまでした。

  • つまずかず「効率的に」学びたい
  • 副業や転職後の「現場で使える」知識やスキルを身につけたい

プログラミングを学習していて、このように思ったことはありませんか?

テックアカデミーのPHP/Laravelコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。

合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、PHP/Laravelを使ったWebアプリケーション開発を学べます。

まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。

時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!

初心者・未経験でもできる。まずはテックアカデミーに相談しよう

プログラミングを独学で学習していて、このように感じた経験はないでしょうか?

  • ・調べてもほしい情報が見つからない
  • ・独学のスキルが実際の業務で通用するのか不安
  • ・目標への学習プランがわからず、迷子になりそう

テックアカデミーでは、このような 学習に不安を抱えている方へ、マンツーマンで相談できる機会を無料で提供 しています。
30分間、オンラインでどんなことでも質問し放題です。

「受けてよかった」と感じていただけるよう カウンセラーやエンジニア・デザイナー があなたの相談に真摯に向き合います。

「自分に合っているか診断してほしい」
「漠然としているが話を聞いてみたい」

こんなささいな悩みでも大丈夫です。

無理な勧誘は一切ありません ので、まずはお気軽にご参加ください。
※体験用のカリキュラムも無料で配布いたします。(1週間限定)

今なら参加者限定の割引特典付き! 無料相談を予約する