7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PHP9】mb_ereg関数が削除されるよ、PCREに移行しよう

7
Last updated at Posted at 2026-06-29

PHPの正規表現はざっくりpreg_match系mb_ereg系の2種類があります。

前者の実体はPerl正規表現のOSS互換ライブラリPerl Compatible Regular Expressionsであり、後者の実体はK.KosakoによるOSSライブラリonigurumaです。

どうしてわざわざ2種類の正規表現エンジンを搭載しているのかはよくわかりません。
どうもPCREはかつてマルチバイトに弱かったので、そちらに強いonigurumaに一日の長があったとかなんとか。

さて後者のoniguruma、なんと2025/04/24にメンテナンス終了してしまいました。
これはつまり、これ以上onigurumaを使い続けるのは不味いということです。

有名なライブラリということでforkも存在しますが、その中で最も有望だったOnigmoもほとんど開発が止まっており、今後の展望は見込めません。
ということでoniguruma系の今後は見通しがよくないことになっています。
ちなみにRubyは現在Onigmoを使っていますが、なんと自力で作りなおすことにしたそうです。
はてさてどうなることでしょう。

PHPメーリングリストでは、onigurumaを自前でforkするかPHPに同梱するかといったの結果、最終的にサポートを削除することに決定しました。

PHP8.6でE_DEPRECATED、PHP9では関数が存在しないエラーになります。
もしプロジェクトがeregでひっかかるようなら、今のうちにPCREへの移行を行いましょう。
PCREとonigurumaの正規表現は微妙に異なるみたいなのですが、そのあたりがまとまってるサイトが見当たらなかったのでよくわかりません。
ただまあ普通の書き方をしている程度なら違いに引っかかることはないでしょうし、違いに引っかかるような書き方をしている程度の人なら自力で移植もできるでしょう。
たぶん。

以下は該当のRFC、Oniguruma maintenance end and end of mbregexの紹介です。
提出者は@youkidearitaiです。

Oniguruma maintenance end and end of mbregex

Introduction

Onigurumaのメンテナンスが2025年4月24日に終了しました。
PHPはmb_ereg_xxx関数でmbregex関数を使用しています。
そこで、今後の方針を決めなければなりません。
このRFCでは、PHP8.6でmbregexを非推奨とし、PHP9.0で削除します。

Proposal

PHP8.6でmbregexが非推奨になり、PHP9.0で削除されます。

Deprecated: Function mb_ereg_replace() is deprecated since 8.6, Oniguruma functions support ends PHP 9.0 in %s on line %d

また、PHP8.2-8.5のメンテナンスバージョンについてはどうするかも方針決定が必要です。

FreeBSDは2026年12月1日にサポート終了することを決定しました。
PHPソースコードのCIに影響するため、サポート終了後の対応について決める必要があります。

Drop the following mbregex functions

以下の関数が使えなくなります。

mb_ereg
mb_ereg_match
mb_ereg_replace
mb_ereg_replace_callback
mb_ereg_search
mb_ereg_search_getpos
mb_ereg_search_getregs
mb_ereg_search_init
mb_ereg_search_pos
mb_ereg_search_regs
mb_ereg_search_setpos
mb_eregi
mb_eregi_replace
mb_regex_encoding
mb_regex_set_options
mb_split

Constants

定数MB_ONIGURUMA_VERSIONが削除されます。

php.ini options

INI設定mbstring.regex_retry_limitmbstring.regex_stack_limitが削除されます。

Forked from Oniguruma

RubyはOnigurumaのfork、Onigmoを使用しています。
ただしOnigurumaとOnigmoは、一部の挙動が異なります

External packaging for mb_onig

このRFCは、UTF-8以外のマルチバイトを使用するユーザにおそらく大きな影響を与えます。
そこで、今後もmb_ereg関数を引き続き利用できるように拡張機能を作成しました。

PHP 8.x

./configure --enable-mbstring --disable-mbregex
make
make install
pie install mb_onig/mb_onig

PHP 9

./configure --enable-mbstring
make
make install
pie install mb_onig/mb_onig

Backward Incompatible Changes

互換性のない変更点。

mbregexが使えなくなります。

Proposed PHP Version(s)

PHP8.6で非推奨、PHP9.0で削除。

Open Issues

Voting Choices

2026/04/25までの投票。
賛成24反対0の全員一致で採用されました。

References

メーリングリスト
Internal

感想

そんなわけで今後PHPの正規表現はPCREに一本化されます。

PCREは現在も活動が活発であり、当面終了する気配はありません。
個人的にはずっと前からpreg_xxxしか使ってないのでほぼ影響ありませんが、宗教上の理由やその他の理由でmb_eregばかり使っていた場合は移行をがんばりましょう。
単純な移行はRectorとか使えば勝手にやってくれると思いますが、挙動が異なる可能性のある正規表現を抽出してくれる移行支援ツールみたいなのは実際ほしいところですね。

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?