147

POSIX 正規表現 (ereg)は PHP 5.3.0以降非推奨になっているため、古い表現をPCRE (Perl 互換正規表現) (preg)に変換する簡単な方法を知りたいです。

たとえば、次の正規表現があります。

eregi('^hello world');

preg_match式を互換性のある式に変換するにはどうすればよいですか?

注:この投稿は、ereg から preg への変換に関連するすべての投稿のプレースホルダーとして、また関連する質問の重複オプションとして機能します。この質問を閉じないでください。

関連している:

4

4 に答える 4

149

構文の最大の変更点は、区切り記号の追加です。

ereg('^hello', $str);
preg_match('/^hello/', $str);

区切り文字は、英数字、バックスラッシュ、または空白文字以外のほとんどすべての文字にすることができます。最もよく使用されるのは、一般に~/および#です。

対応する括弧を使用することもできます:

preg_match('[^hello]', $str);
preg_match('(^hello)', $str);
preg_match('{^hello}', $str);
// etc

デリミタが正規表現で見つかった場合は、エスケープする必要があります。

ereg('^/hello', $str);
preg_match('/^\/hello/', $str);

preg_quoteを使用すると、文字列内のすべての区切り文字と予約文字を簡単にエスケープできます。

$expr = preg_quote('/hello', '/');
preg_match('/^'.$expr.'/', $str);

また、PCRE はさまざまな修飾子をサポートしています。最もよく使用されるのは、eregiiの代替である、大文字と小文字を区別しない修飾子です。

eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');

PHP の PCRE 構文の完全なリファレンスは、マニュアルに記載されています。式の変換に役立つ POSIX 正規表現と PCREの相違点のリストもあります。

ただし、単純な例では、正規表現を使用しません。

stripos($str, 'hello world') === 0
于 2011-06-07T18:37:03.270 に答える
34

Ereg を preg に置き換えたこと (PHP 5.3.0 以降) は、私たちに有利な正しい動きでした。

Perl 互換の正規表現構文を使用する preg_match は、多くの場合、ereg のより高速な代替手段です。

ereg パターンを preg に移植するには、主に 4 つのことを知っておく必要があります。

  1. 区切り記号(/) を追加します。'pattern' => '/pattern/'

  2. パターンの一部である場合は区切り文字をエスケープ'patt/ern' => '/patt\/ern/'
    します。次の方法でプログラムで実現します。
    $old_pattern = '<div>.+</div>';
    $new_pattern = '/' . addcslashes($old_pattern, '/') . '/';

  3. eregi (大文字と小文字を区別しないマッチング):'pattern' => '/pattern/i' したがって、大文字と小文字を区別しない eregi 関数を使用している場合は、新しいパターン ('/pattern/') の末尾に 'i' を追加するだけです。

  4. ASCII 値: ereg では、パターンで数値を使用すると、文字の ASCII を参照していると見なされます。ただし、preg では数値は ASCII 値として扱われません。そのため、パターンの ereg 式に ASCII 値が含まれている場合 (改行、タブなど)、それを 16 進数に変換し、前に \x を付けます。
    Example: 9(tab) becomes \x9 or alternatively use \t.

于 2013-04-24T06:52:06.883 に答える
7

ereg()と の間にpreg_replace()は、構文だけでなく、さらに多くの違いがあります。

  • 戻り値:

    • エラー時: 両方とも戻りますFALSE
    • 一致しない場合:をereg()返しますFALSE, をpreg_match()返します0
    • 一致した場合:ereg()文字列の長さまたは1preg_match()返し、常に返す1
  • 一致した部分文字列の結果の配列: 一部の部分文字列がまったく見つからない場合 ( (b)in )、結果...a(b)?の対応する項目は になりますが、 inはまったく設定されません。ereg()FALSEpreg_match()

ereg()に変換する勇気がない場合は、PHP 7 でまだ利用可能なmb_ereg()preg_match()を使用できます。

于 2016-12-01T15:42:23.177 に答える