"BOKU"のITな日常

62歳・文系システムエンジニアの”BOKU”は日々勉強を楽しんでます

PHPのmb*系正規表現メソッドでよく使う3つだけメモ/Windows10

PHPUTF-8を前提にすると文字列を扱うのは「mb*」系一択です。

なんですが、PHP以外の言語を使っている時間の方が長いので、正規表現系のメソッドを使おうとしたらど忘れていた・・ってのが多いです。

なので、よく使うものだけメモしておきました・・って感じです。

f:id:arakan_no_boku:20190922143447p:plain

 

はじめに

 

 

今回は、ほぼ自分用のメモみたいなもんです。

すいません。

mb系の正規表現で、自分がよく使う3種類だけ、使い方と例(サンプル)を書いていきます。

他の言語やってて、PHPに戻った時に「何故かど忘れしている率」が高いから、その時にさらっとみられるようにしとこうというだけでの記事です。

これはちょっと前に書いてて下書きでおいてたのですが、ちょっと、自分のIDでログインできない環境でも作業することがでてきたので、公開することにしました。

ネタにしてる文章を見ると、いつ頃書いてたか丸わかり(笑)ですが・・。

 

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つ。

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

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

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

 

部分一致をとるケース

 

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

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

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

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

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

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

 

最長一致のケース

 

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

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

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

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

結果は

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

です。

 

最短一致のケース

 

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

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

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

結果は

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

 

です。

 

分割のケース

 

splitを使います。

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

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

結果は

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

てな感じです。

 

置換のケース

 

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でしょうから、ほとんど意識することはないのですが、他の内部エンコーディングの設定と共通ではなく独立していることは、頭にはいれといたほうが良いかな・・。

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

なんか、ホントにメモ・・です。

ではでは。