[ PHP ] 正規表現サンプル12選 ( preg_match / preg_match_all)

Pocket

正規表現のパターン文字列は ” / ” と ” / ” で囲って記述します。ここでは、preg_match 関数を使用した正規表現の基本的なサンプルを掲載しています。

スポンサーリンク

文字列内に指定したパターンの文字列が存在するか確認する

ある文字列から指定したパターンの文字列が存在するか確認するサンプルコードです。preg_match 関数は、一つでもパターンにマッチした文字列を検出すると処理を直ちに終了しますが、 preg_match_all  関数は、すべての文字列を検証します。複数のパターンの一致を検出した場合はすべての結果をリターンします。

$subject = "php5 perl5 apache1.3 apache2.2";  // 検出対象の文字列
$pattern = '/apache/';                        // 検出パターン

$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 1
var_dump($matches);
// array
//   0 => string 'apache' (length=6)

$match_num = preg_match_all($pattern, $subject, $matches);
var_dump($match_num); // int 2
var_dump($matches);
// array
//   0 => 
//     array
//       0 => string 'apache' (length=6)
//       1 => string 'apache' (length=6)

大文字・小文字を区別しない

特に指定しない場合は正規表現は大文字・小文字を区別します。大文字・小文字を区別せずにパターン検出する場合はパターン文字列の最後に ” i ” を付加します。

$subject = "php5 perl5 apache1.3 apache2.2";

$pattern = '/Apache/';      // 検出パターン(大文字・小文字を区別する)
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num);   // int 0
var_dump($matches);     // array empty

$pattern = '/APACHE/i';
$match_num = preg_match($pattern, $subject, $matches); // 検出パターン(大文字・小文字を区別しない)
var_dump($match_num); // int 1
var_dump($matches);  // array 0 => string 'apache' (length=6) 

対象文字列の先頭から一致するか確認する

正規表現 ‘ ^ ‘ を使用することにより、対象文字列の先頭から一致しているか確認することができます。 何も指定していない場合は、対象文字列内のどこに存在していてもパターンと一致するとみなされます。

$subject = "php5 perl5 apache 1.3 apache2.2";    // 検索対象文字列

// パターン文字列 apache と一致すると判断される
$pattern = '/apache/';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 1
var_dump($matches);   // array 0 => string 'apache' (length=6)

/*
 * 検索対象文字列は apache で始まっているためアンマッチと判断される
 */
$pattern = '/^apache/';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 0
var_dump($matches);   // array empty

/*
 * 検索対象文字列は php5 で始まっていないため一致すると判断される
 */
$pattern = '/^php5/';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 1
var_dump($matches);   // array 0 => string 'php5' (length=4)

行末の文字とマッチさせる(特殊文字 ‘ $ ‘)

行頭と一致させる正規表現が ‘ ^ ‘ であるのに対し、行末の文字とパターンマッチを行うには ‘ $ ‘ を使用します。

$subject = "php5 perl5 apache 1.3 apache2.2"; // 抽出対象文字列

/*
 * 行末が 'apache2.2' でないためマッチしない 
 */
$pattern = '/apache$/';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 0
var_dump($matches);   // array empty

/*
 * 行末が 'apache2.2' であるためマッチする 
 */
$pattern = '/apache2\.2$/';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 1
var_dump($matches);   // array 0 => string 'apache2.2' (length=9)

apache2.2 を aspache2\.2 としているのは、正規表現の特殊文字(メタキャラ)でドット( . )が使用されているのでエスケープさせる必要があるためです。

任意の一文字とマッチさせる(ドット)

ドット(.)をしようすると、任意の一文字としてパターンマッチされます。例えば 文字列 abcXdef 内の X を任意の一文字としてパターンマッチするには、以下のように /abc.def/ と記述します。

$subject = "abcXdef";
/*
 * マッチする
 */
$pattern = '/^abc.def/';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 1
var_dump($matches);   // array 0 => string 'abcXdef' (length=7)

$subject = "abcZdef";
/*
 * マッチする
 */
$pattern = '/^abc.def/';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 1
var_dump($matches);   // array 0 => string 'abcZdef' (length=7)

エスケープ

任意の一文字にマッチする特殊文字(.)は便利ですが、ドット自体をマッチさせたい場合は ( . )の前に( \ )を記述する必要があります。

// 円周率をパターンマッチさせる
$subject = '3.14';  // 円周率

/*
 * マッチする(ただし、例えば '3X14' でもマッチしてしまうので間違い)
 */
$pattern = '/3.14/';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 1
var_dump($matches);   // array array 0 => string '3.14' (length=4)

/*
 * マッチする(円周率のみマッチする)
 */
$pattern = '/3\.14/';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 1
var_dump($matches);   // array array 0 => string '3.14' (length=4)

直前文字の繰り返し(*、+)

// 以下のいずれの場合でもマッチする
$subject = "google";
//$subject = "goooooooooooooogle";
//$subject = "gooooooooooooooooooooooooooogle";

/*
 * マッチする
 */
$pattern = '/goo*gle/'; 
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 1
var_dump($matches);   // array 0 => string 'google' (length=6)

/*
 * マッチする
 */
$pattern = '/goo+gle/';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 1
var_dump($matches);   // array 0 => string 'google' (length=6)

特殊文字(*) と (+) の違いは、 ( * ) は直前の文字が存在しなくともパターンマッチしますが、( + ) は直前の文字が存在しないとマッチしないということです。

// 抽出対象文字列
$subject = "gogle";

/*
 * マッチする
 */
$pattern = '/goo*gle/'; 
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 1
var_dump($matches);   // array 0 => string 'gogle' (length=5)

/*
 * マッチしない
 */
$pattern = '/goo+gle/';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 0
var_dump($matches);   // array empty

直前の文字が存在するか、存在しないかわからない場合(特殊文字 ? )

下記は、スペース(1文字)の有無に関わらず、 いずれの場合でもパターンマッチさせる特殊文字( ? ) を使用した正規表現の例です。

// 検索対象文字列
$subject = "centos";    // マッチする(スペースなし)
//$subject = "cent os"; // マッチする(スペースあり)

$pattern = '/cent ?os/'; // スペースがあり、なしに関わらずマッチさせる
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); // int 1
var_dump($matches);   // array 0 => string 'centos/cent os' (length=6/7)

繰り返し回数の指定( {n}  {n,}  {n, m} )

特殊文字 ‘ { } ‘ を使用して、ある文字の繰り返し回数を指定してマッチングを行うことができます。

構文意味
{n}繰り返し回数が n 回
{n, }繰り返し回数が n 回以上
{n, m}繰り返し回数が n 回から m 回
// 検索対象文字列
$subject = "11111";     

$pattern = '/^1{4}/';      // 1 が 4回連続するのでマッチする
//$pattern = '/^1{5}/';    // 1 が 5回連続するのでマッチする
//$pattern = '/^1{6}/';    // 1 が 6回連続しないのでアンマッチ

$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num);      // int 1
var_dump($matches);        // array 0 => string '11111' (length=5)

$pattern = '/^1{5,}/';     // 1 が 5回以上連続するのでマッチする
//$pattern = '/^1{6,}/';   // 1 が 6回以上連続しないのでアンマッチ
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num);      // int 1
var_dump($matches);        // array 0 => string '11111' (length=5)

$pattern = '/^1{7, 10}/';  // 1が7~10回の連続ではないのでアンマッチ
//$pattern = '/^1{1, 4}/'; // 1が1~4回の連続なの(を含む)でマッチする
//$pattern = '/^1{3, 7}/'; // 1が3~7回の連続なのでマッチする
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num);      // int 1
var_dump($matches);        // array empty

マッチング対象文字を範囲指定する(特殊文字 ‘ [ ] ‘)

特殊文字 ‘ [] ‘ を使用して、文字がある範囲内の数値であるかをパターンマッチさせることができます。なお、行頭からの一致を示す特殊文字 ‘ ^ ‘ を ‘ [] ‘ 内で使用すると否定( NOT )を表すようになります。また、パターン文字を特定するのではなく、 [a-z] のようにハイフン( – )を使用して範囲指定を行うことができます。

構文意味
[0z]数値の 0 または 小文字の z 文字である場合にマッチ
[a-z]小文字の a ~ z 内の文字である場合にマッチ
[A-Z]大文字の A ~ Z 内の文字である場合にマッチ
[0-9]数値の 0 ~ 9 内の文字である場合にマッチ
[^A-Z]大文字の A ~ Z 以外の文字である場合にマッチ
[^a-zA-Z]小文字 a ~ z 大文字の A ~ Z 内の文字以外である場合にマッチ
// 検索対象文字列
$subject   = "0";   // マッチする
//$subject = "z"; // マッチする
//$subject = "Z"; // マッチしない

$pattern = '/[0z]/'; // 0 または z のパターンを抽出
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); 
var_dump($matches);   

// 検索対象文字列
$subject   = "a";   // マッチする
//$subject = "0"; // マッチする
//$subject = "A"; // マッチしない

$pattern = '/[a-z0-9]/'; // 小文字の a ~ z または 数字の 0 ~ 9 のパターンを抽出
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num);
var_dump($matches);

// 検索対象文字列
$subject   = "j";   // マッチする
//$subject = "k";   // マッチしない

$pattern = '/[^a-ik-zA-Z0-9]/'; // 小文字の j 以外 && 大文字A ~ Z 以外 かつ 数値 0 ~ 9 以外を抽出
//$pattern = '/[j]/';           // 小文字の j を抽出(上記に近い。同じではないが。)
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num);
var_dump($matches);

抽出パターンに複数の条件を設定する(特殊文字:パイプ ‘ | ‘)

パイプ( | )を使って複数の抽出条件を記述できます。 なお、条件は or (論理和)です。

// 検索対象文字列
$subject = "mac";     // マッチする
//$subject = "linux";   // マッチする
//$subject = "windows"; // マッチする
//$subject = "solaris"; // マッチしない

// 複数文字列を指定してパターン抽出する
$pattern = '/mac|linux|windows/';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); 
var_dump($matches);   

グループ化(特殊文字 ‘ ( ) ‘ )

グループ化を使用してパターンの一部を複数の文字列でマッチングさせることができます。 以下は URI のスキーマ部分の抽出を行うサンプルになります。

// 検索対象文字列
$subject   = "http://";   // マッチする
//$subject = "https://";  // マッチする
//$subject = "ftp://";    // マッチする
//$subject = "file://";   // マッチする
//$subject = "http:";     // マッチしない('//' が足りない)
//$subject = "telnet://"; // マッチしない(未設定のスキーマである)

// グループ化して複数の抽出パターンを指定する。
// '/' は正規表現の囲み文字と区別するために '\' でエスケープする必要がある
$pattern = '/(https?|ftp|file):\/\//';
$match_num = preg_match($pattern, $subject, $matches);
var_dump($match_num); 
var_dump($matches);   

// '/' をエスケープしないと以下のエラーが警告が発生し、false がリターンされる

// Warning: preg_match() [function.preg-match]: Unknown modifier '/' in ・・・

長くなりました。。。

スポンサーリンク


Pocket

2 thoughts on “[ PHP ] 正規表現サンプル12選 ( preg_match / preg_match_all)”

  1. Pingback: 【WordPress】Function.phpでのエラー集まとめ・対応策 – Rplay [リプレイ]

Leave a Comment

Your email address will not be published. Required fields are marked *