

ereg_matchとpreg_matchの違いについて教えて下さい。

どちらも正規表現でマッチできるようなのですが、どちらを使ったら良いのか判断できません。

もしほとんど同じ機能であれば、とりあえずどちらを使うようにしておけば大丈夫といった指標などはありますか?


CC BY-SA 3.0
2015-02-02T07:20:24.197
5760
2016-04-12T07:46:13.787
2016-04-12T07:46:13.787
8000
7339
question
php 正規表現
ereg_matchとpreg_matchの違いについて教えて下さい。


`ereg_match`は`ereg`のことだと仮定して回答いたします。

違いについては [PHP: POSIX 正規表現との違い -
Manual](https://www.php.net/manual/ja/reference.pcre.pattern.posix.php)
にまとまっています。 // 長いので全文引用は避けます  
もっとも大きい違いは、`preg_match`関数ではデリミターが必要である点でしょうか。

次にどちらを使うべきかの指標ですが、[`ereg`関数のリファレンス](https://www.php.net/manual/ja/function.ereg.php)では

> **警告** この関数は PHP 5.3.0 で _非推奨_ となりました。 この機能を使用しないことを強く推奨します。

とあり、さらに

> **ヒント** **ereg()** は PHP 5.3.0 以降で非推奨になりました。この関数のかわりに
> [preg_match()](https://www.php.net/manual/ja/function.preg-match.php)
> を使うことを推奨します。

とあります。  
したがって、`preg_match`関数を使う方がよいでしょう。


CC BY-SA 3.0
2015-02-02T07:49:29.123
5764
2015-02-02T07:49:29.123
2023-11-17T20:00:27.870
-1
3160
5760
answer


ereg_match = mb_ereg_match  
という意図でのご質問なのであれば、マルチバイト文字列を扱うか否かがポイントになりそうです。

下記リンク先でいろいろ試されているようです。  
<http://www.nilab.info/z3/20140522_01_php_regex.html>


CC BY-SA 3.0
2015-02-02T08:11:30.307
5766
2015-02-02T08:11:30.307
3516
5760
answer


まず最初に結論から書きますが、私は、非マルチバイト文字か UTF-8 文字コードの文字列を扱うのであれば、`preg_match` など PCRE
正規表現を用いており、それ以外の（UTF-8 以外のマルチバイト文字を扱う）場合のみ、`mb_ereg` などの mberegex 正規表現を用います。

その理由は以下の通りです。

  * ereg 系の regex 正規表現は PHP 5.3 以降 **非推奨** になっているため。
  * mb_ereg 系の mbregex の正規表現についての詳細が PHP マニュアルにないため。
  * preg 系の PCRE 正規表現のパターン修飾子や、構文などについて、PHP マニュアルで **詳細に** 記述されているため。

# PHP の正規表現

まず、PHP には3つの正規表現を行う関数群があります。

  * preg 系正規表現 (PCRE)
  * ereg 系正規表現 (regex)（ **非推奨** ）
  * mb_ereg 系正規表現 (mbregex)

それぞれについて下記します。

## preg 系正規表現 (PCRE)

[PCRE](http://php.net/pcre)（Perl-Compatible Regular
Expressions）モジュールで提供される正規表現で、Perl 言語の互換正規表現です。

`u` スイッチを用いることで UTF-8 の文字列として処理させることができます。

また、デリミタが必要で、`.` はデフォルトでは改行にマッチしません。

[code]

    $str = 'abcdefghijklmnopqrstuvwxyz';
    var_dump(preg_match('/h.+y/', $str));
    // output: 1（マッチする）
    
    $str = "abcdefghijklmn\n"
        . "opqrstuvwxyz";
    var_dump(preg_match('/h.+y/', $str));
    // output: 0（マッチしない、改行は . にマッチしない）
    
[/code]

パターンに使用できる修飾子や正規表現構文については、PHP マニュアルでも詳細に書かれているので参考にしてください。

  * [PHP マニュアル: PCRE パターン修飾子](http://php.net/manual/ja/reference.pcre.pattern.modifiers.php)
  * [PHP マニュアル: PCRE パターン構文](http://php.net/manual/ja/reference.pcre.pattern.syntax.php)

## ereg 系正規表現 (regex)（ **非推奨** ）

[POSIX regex](http://php.net/regex) モジュールで提供される、[POSIX
1003.2](http://alfred.s10.xrea.com/regex.php)で定義された POSIX 拡張正規表現。

PHP 5.3 以降で非推奨となり、バイナリセーフではないため、使用を避けた方がいいです。  
<http://php.net/manual/ja/intro.regex.php>

## mb_ereg 系正規表現 (mbregex)

[mbstring](http://php.net/mbstring) モジュールに含まれるマルチバイト文字用正規表現。

`php.ini` の `mbstring.internal_encoding` か `mb_regex_encoding()`
で指定した文字エンコーディングとして動作する。（`mb_internal_encoding()` で指定しても mb_ereg
の文字エンコーディングは変更されないので注意）

また、デリミタは不要で、`.` はデフォルトで改行にマッチします。

[code]

    $str = 'abcdefghijklmnopqrstuvwxyz';
    var_dump(mb_ereg('h.+y', $str));
    // output: 1（マッチする）
    
    $str = "abcdefghijklmn\n"
        . "opqrstuvwxyz";
    var_dump(mb_ereg('h.+y', $str));
    // output: 1（マッチする、改行も . にマッチ）
    
[/code]

### mb_ereg_match について

`mb_ereg_match` は文字列の最初からマッチしているかどうかを判定します。（`preg_match`
と同じように）文字列の途中にあってもマッチさせたい場合、`mb_ereg` を用います。

[code]

    $str = 'abcdefghijklmnopqrstuvwxyz';
    var_dump(mb_ereg_match('a', $str));
    // output: true（マッチする）
    
    $str = 'abcdefghijklmnopqrstuvwxyz';
    var_dump(mb_ereg_match('g', $str));
    // output: false（マッチしない、gで始まっていないため）
    
    $str = 'abcdefghijklmnopqrstuvwxyz';
    var_dump(mb_ereg_match('.+g', $str));
    // output: true（マッチする）
    
    $str = 'abcdefghijklmnopqrstuvwxyz';
    var_dump(mb_ereg('g', $str));
    // output: 1（マッチする）
    
[/code]

# 参考リンク

  * [PHP マニュアル: preg_match](http://php.net/preg_match)
  * [PHP マニュアル: PCRE パターン修飾子](http://php.net/manual/ja/reference.pcre.pattern.modifiers.php)
  * [PHP マニュアル: PCRE パターン構文](http://php.net/manual/ja/reference.pcre.pattern.syntax.php)
  * [PHP マニュアル: mb_ereg_match](http://php.net/mb_ereg_match)
  * [PHP マニュアル: ereg](http://php.net/ereg)
  * [PHP マニュアル: ereg](http://php.net/ereg)
  * [PHP の正規表現があまりに複雑なのでまとめてみた](http://d.hatena.ne.jp/Kenji_s/20130221/php_regexp)


CC BY-SA 3.0
2015-02-02T11:41:07.027
5783
2015-02-09T02:32:12.450
2015-02-09T02:32:12.450
2944
2944
5760
answer