【PHP入門】正規表現の抽出方法

こんにちは!フリーエンジニアのヤマシタです。

PHPでは正規表現を使用して、さまざまな方法で文字列を抽出することができます。

この記事では、

・正規表現で配列の要素を抽出する方法
・正規表現で日付を抽出する方法

という基本的な内容から、

・正規表現でhtmlのタグの内容を抽出する方法
・正規表現で日本語をチェックする方法

などの応用的な使い方に関しても解説していきます。

今回はそんなPHPの正規表現による抽出方法について、わかりやすく解説します!

正規表現とは?

正規表現とは、wikipediaで次のように説明されています。

正規表現(せいきひょうげん、英: regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つである。

つまり、文字列の集まりを1つの形式で表すための方法です。

1つの形式にさまざまな意味を持たせることで、指定した文字列から特定の文字列を置換・抽出・検索することが可能になります。

また、正規表現はPHP以外の言語でも扱うことができるため、覚えておくととても便利です。

正規表現についてさらに詳しく知りたい方は、次の記事をみてみてくださいね!

【PHP入門】正規表現で検索・抽出・置換する5つの関数を使い倒せ!
更新日 : 2019年5月11日

配列の要素を抽出する

ここではpreg_grep関数を使用して、指定した正規表現にマッチする配列の要素を取得する方法について解説します。

preg_grep関数を使用する

正規表現のパターンに一致する要素を取得するためには、preg_grep関数を使用します。

preg_grep関数は、第一引数に正規表現のパターン、第二引数に対象の配列を指定し、第三引数にPREG_GREP_INVERTを指定すると、パターンにマッチしない配列の要素を返します。

preg_grep( 正規表現パターン , $配列 [, $フラグ] )

以下にpreg_grep関数を使用して、パターンにマッチした配列を取得する処理を記述します。

<?php

$array = [1, 'a', 2, 'b', 3, 'c'];

//preg_grepで小文字のアルファベットを抽出する
$array_grep = preg_grep('/[a-z]/', $array);

var_dump($array_grep);

?>
実行結果
array(3) { [1]=> string(1) "a" [3]=> string(1) "b" [5]=> string(1) "c" }

サンプルでは正規表現パターンに、アルファベットのa-zが含まれているかを指定し、戻り値にマッチした配列を返しています。

数字のみを抽出したい場合は、正規表現を以下のように記述します。

$array_grep = preg_grep('/[0-9]/', $array);

日付を抽出する

ここではpreg_match関数を使用して、指定した正規表現にマッチした文字列を取得する方法を解説します。

preg_match関数を使用する

文字列から指定した正規パターンの文字列のみを抽出したい場合は、preg_match関数を使用します。

preg_match関数は、第一引数に正規表現のパターン、第二引数に対象の文字列を指定し、第三引数を指定した場合は検索結果が返されます。

また、第三引数以降は検索オプションを指定することができます。

preg_match( 正規表現パターン , $入力文字列 [, $検索結果 [, $フラグ = 0 [, オフセット = 0 ]]] )

以下にpreg_match関数を使用して、文字列から日付のみを抽出する方法を記述します。

<?php

$date_text = '本日は2017/04/01です。';

//YYYY/MM/DDの日付形式を抽出する
preg_match('|\d{4}\/\d{1,2}\/\d{1,2}|', $date_text, $date_match);

var_dump($date_match);

?>
実行結果
array(1) { [0]=> string(10) "2017/04/01" }

htmlのタグの内容を抽出する

ここではpreg_match_all関数を使用して、htmlのタグに含まれている情報を取得する方法について解説します。

preg_match_all関数を使用する

繰り返し正規表現による検索を行い、指定したバターンの文字列を抽出したい場合は、preg_match_all関数を使用すると便利です。

preg_match_all関数は、第一引数に正規表現のパターン、第二引数に対象の文字列を指定し、第三引数を指定した場合は多次元配列で検索結果が返されます。

また、第三引数以降は検索オプションを指定することができます。

preg_match_all ( 正規表現パターン , $入力文字列 [, $検索結果 [, $フラグ = 0 [, オフセット = 0 ]]] )

以下にpreg_match_all関数を使用して、htmlのタグの内容を取得する処理を記述します。

<?php

$html_text = '<title>Samurai Engineer</title>';

//preg_match_allで指定したタグの内容を取得する
preg_match_all("/<title>(.*?)<\/title>/i", $html_text, $matches);

var_dump($matches);

?>
実行結果
array(2) { [0]=> array(1) { [0]=> string(31) "" } [1]=> array(1) { [0]=> string(16) "Samurai Engineer" } }

サンプルでは、正規表現でtitleタグが存在したら、(.*?)でタグの文字列を取得しています。

URLを抽出する

preg_match_all関数を使用して、htmlのタグに記載しているURLを取得する場合は、以下のように記述します。

<?php

$url_txst = '<a href="https://www.sejuku.net/blog/" class="samurai" title="samurai"></a>';

preg_match_all('|<a href=\"(.*?)\".*?>(.*?)</a>|', $url_txst, $matches);

var_dump($matches);

?>
実行結果
array(3) { [0]=> array(1) { [0]=> string(74) "" } [1]=> array(1) { [0]=> string(27) "https://www.sejuku.net/blog/" } [2]=> array(1) { [0]=> string(0) "" } }

日本語を抽出する

文字列の中に指定した正規表現が含まれているかチェックする場合は、条件文でpreg_match関数やpreg_match_all関数を使用します。

preg_match、preg_match_all関数はbool型の値を返しますので、文字列を抽出するだけではなく、指定した正規表現パターンが含まれているか?チェックすることも可能です。

以下に日本語が含まれているかチェックする方法を記述します。

<?php

$nihongo_text = 'Samurai Engineer、侍エンジニア';

//日本語が含まれているかチェックする
if (preg_match_all('/[ぁ-んァ-ヶ亜-熙]/', $nihongo_text, $matches)){
  echo '日本語が含まれています';
}else{
  echo '日本語が含まれていません';
}

?>
実行結果
日本語が含まれています

日本語(ひらがな、カタカナ、漢字)を正規表現で検索する場合は、サンプルで指定しているように、"ぁ-んァ-ヶ亜-熙"を指定します。

正規表現についてもっと詳しく知りたい方へ

正規表現のさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

まとめ

ここでは、正規表現を使用した文字列の抽出方法や、チェック方法について紹介しました。

正規表現を使用して文字列を抽出する処理は、よく使用しますのでこの機会にぜひ覚えておきましょう。

もし、正規表現を使用して文字列を抽出する方法を忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部としてこれまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。