はじめに
ねるねるねるね うちゅうのフルーツ味が美味しい季節になってきました。
ところで、preg_match関数のpregってなんですかね。
気になったので調べてみました。
結論
PerlのpとRegexのregを組み合わせた造語だそうです。
ちなみにPerlはテキスト処理に特化したスクリプト言語で、Regexは正規表現です。
以下、詳細
1. PHPにおける命名の規則性
PHPの正規表現関数は、その関数が「どのエンジン(規格)を使用して処理を行うか」を一目で判別できるよう、次の法則に基づいて命名されています。
[エンジン識別子(接頭辞)]+[reg(正規表現の略称)]_[具体的な動作]
いくつか例を挙げるとこんな感じです。
- ereg_ (E + reg)
- エンジン: Extended POSIX
- かつての標準。処理速度や機能面でPCREに劣り、現在は廃止されている1
- mb_ereg_ (mb_ + E + reg)
- エンジン: Multi-byte POSIX
- 日本語などのマルチバイト文字を扱うためのエンジン(主に鬼車)を使用する。2
pregも「P + reg」という「接頭辞 + 機能略称」の組み合わせで命名されています。
2. pが指すもの
改めて、接頭辞のpはプログラミング言語Perlの頭文字です。
なぜPerlのpを取ったかと言えば、preg_matchが内部で、PCRE (Perl Compatible Regular Expressions) という文法がPerlと完全に互換している外部ライブラリ Perlをベースに発展したPCREという外部ライブラリを使用しているためです。3
デリミタは一部Perlと互換性がある証
preg_match('/abc/', ...) のように、パターンを /(スラッシュ)で囲むデリミタが必要なのは、Perlの文法をそのまま踏襲しているからです。
PHP3〜4の頃に使われていたeregにはこのルールはありませんでした。
参考:https://so-zou.jp/web-app/tech/programming/php/grammar/data-type/string/regular-expression.htm
ちなみに、PCRE自体はC言語で実装されています。
※追記(2026/05/21)
PCREの構文や機能はPerlと完全に互換している訳ではないため、preg_* 関数は「Perlの機能をそのまま使える関数」というより、「Perlをベースに発展した、PCREという独立した正規表現ライブラリの固有名詞」と捉える方が適切でした。
最後に
preg_matchという関数名は、「Perl譲りの正規表現のルールを使って、一致するパターンがあるか探す」という意味でした。
ちなみに、PHP7.3以降は内部エンジンがPCREからPCRE2に入れ替わってますが、関数名はそのままpregです。4
今日はこの辺で。
【2026/05/21 追記】コメント欄にて@tadsanさんに、より正確で幅広い知見を補足していただきました🙌