SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

PHPのmb*系正規表現メソッドで、よく利用するケース(最長一致・最短一致とか)のサンプル

f:id:arakan_no_boku:20190922143447p:plain

目次

PHPのmb*系正規表現メソッドで、よく利用するケースのサンプル

mb系の正規表現で、個人的によく使う3種類のメソッドの使い方と例(サンプル)を書いていきます。

ずっとPHPだけ使って開発しているわけではないので、他の言語やってて、PHPに戻った時に「何故かど忘れしている率」が高いのが、これらだからです。

 

mb*系の正規表現メソッド

PHPの「mb*系の正規表現」で個人的によく使うのは、以下の3つだけです。

mb_ereg()

マルチバイト対応の正規表現マッチを行います。

一致した部分文字列の取得も可能です。

mb_ereg_replace()

マルチバイト文字列に正規表現による置換を行います。

 

mb_split()

マルチバイト文字列を正規表現によって、分割します。

 

正直。

  • マッチができて、部分文字列の取得もできる。
  • 置換ができる。
  • 分割ができる。

以外に正規表現で何することは、個人的にはありませんから。

滅多に使わないようなパターンがでてきたら、その時に調べればいいんじゃないか・・と思ってます。 

 

サンプルソース全体

ソースとしては以下のごく短いものです。

<?php
$str = "ラグビーワールドカップの「日本VSアイルランド」の19:12の勝利は興奮した。でもWorld-Cupでは稀な「番狂わせ」かもしれないけど、もう「奇跡」じゃないよね。";
$tsv = "昨日と今日と明日やyesterday・today・Tomorrow";

mb_internal_encoding("UTF-8");
mb_regex_encoding('UTF-8');
if (mb_ereg('(\d{2}):(\d{2})', $str, $arr)) {
    print_r($arr);
}
if (mb_ereg('(「日本.*」).*(「番.*」)', $str, $arr)) {
    print_r($arr);
}
if (mb_ereg('(「日本.*」).*(「番.*?」)', $str, $arr)) {
    print_r($arr);
}

print_r(mb_split("[と・]", $tsv));

$pattern = "ワールドカップ|World-Cup";
$replaced_str = mb_ereg_replace($pattern, 'W杯', $str);
print_r($replaced_str);

マッチするケースが3つ。

分割1つ。

置換1つ。

それだけのサンプルを上記のソースにのせてます。

どれもよく使うパターンです。

もちろん、条件は都度違いますけど・・・。

 

ケース1:部分一致サンプル

 

まず、普通に「\d」で数字にマッチさせて、部分一致をとってます。

()でくくっている部分にマッチしたものを抜き出します。

 mb_ereg('(\d{2}):(\d{2})', $str, $arr

結果は$arrにはいり、[0]に全体、[1]以降に部分一致がはいります。

Array
(
[0] => 19:12
[1] => 19
[2] => 12
)

ちゃんとそうなってますね。

 

ケース2:最長一致サンプル

 

最長一致はデフォルトです。

以下のように書かれていると

mb_ereg('(「日本.*」).*(「番.*」)', $str, $arr)

同じマッチだと長い方を返します。

結果は

Array
(
[0] => 「日本VSアイルランド」の19:12の勝利は興奮した。でもWorld-Cupでは稀な「番狂わせ」かもしれないけど、もう「奇跡 」
[1] => 「日本VSアイルランド
[2] => 「番狂わせ」かもしれないけど、もう「奇跡」
)

です。

 

ケース3:最短一致サンプル

最短一致をするには「?」を使います。

mb_ereg('(「日本.*」).*(「番.*?」)', $str, $arr)

?をつけてるので、同じ条件でも短い方に一致してます。

結果は

Array
(
[0] => 「日本VSアイルランド」の19:12の勝利は興奮した。でもWorld-Cupでは稀な「番狂わせ」
[1] => 「日本VSアイルランド
[2] => 「番狂わせ」
)

 

です。

 

ケース4:分割サンプル

splitを使います。

mb_split("[と・]", $tsv)

「と」か「・」で分割してます。

結果は

Array
(
[0] => 昨日
[1] => 今日
[2] => 明日やyesterday
[3] => today
[4] => Tomorrow
)

てな感じです。

 

ケース5:置換サンプル

replaceを使います。

mb_ereg_replace($pattern, 'W杯', $str)

「ワールドカップ」か「World-Cup」を「W杯」に置き換えてます。

結果は

ラグビーW杯の「日本VSアイルランド」の19:12の勝利は興奮した。でもW杯では稀な「番狂わせ」かもしれないけど、もう「奇跡」 じゃないよね。

 OKそうですね。

 

その他もろもろの補足

デフォルトで困ったことはなく、自分は何もしてませんが、「b_regex_set_options()」で、正規表現のオプションとモードを指定できます。

指定可能なオプションとモードはこちらを参照です。

あと。

使えそうなメタ文字の一覧をまとめていただいているページのリンクです。

すべては試してないので、掲載されているものが全てそのまま使えるかどうかは知りませんが、自分で最終的には考えるにせよ、きっかけにはなるかなと思ってリンク貼り付けておきます。

www.megasoft.co.jp

あと。

マルチバイト正規表現用のエンコーディング

mb_regex_encoding()

という関数で取得または設定します。

これも、ほとんどの環境でデフォルトがUTF-8でしょうから、ほとんど意識することはないのですが、他の内部エンコーディングの設定と共通ではなく独立していることは、頭にはいれといたほうが良いかな・・。

とか・・、こんなものかな。

ではでは。