web-dev-qa-db-ja.com

PHPでereg式をpregに変換するにはどうすればよいですか?

POSIX正規表現(ereg) はPHP 5.3.0以降廃止されるため、古い表現を PCRE(Perlに変換する簡単な方法を知りたい互換性のある正規表現)(preg)

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

eregi('^hello world');

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

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

関連:

132
netcoder

構文の最大の変更点は、 delimiters の追加です。

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は、さまざまなことについて modifiers をサポートします。最もよく使用されるものの1つは、大文字と小文字を区別しない修飾子iです。これは、 eregi の代替です。

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

マニュアルのPHPのPCRE構文 への完全なリファレンス、およびPOSIX正規表現とPCRE間の変換を支援する 相違点のリスト を見つけることができます。表現。

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

stripos($str, 'hello world') === 0
132
netcoder

Preg(PHP 5.3.0以降)でのEregの置き換えは、私たちにとって有利な動きでした。

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関数を使用している場合は、新しいパターンの末尾に 'i'を追加するだけです( '/ pattern /' )。

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

30
Sumoanand

ereg()preg_replace()には、単なる構文よりも多くの違いがあります。

  • 戻り値:

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

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

7
Roman Hocke

PHPバージョン5.3以降、eregは非推奨です。

eregからpreg_matchへの移行は、パターンのわずかな変更です。

まず、コードに区切り文字を追加する必要があります。例:

ereg('A-Z0-9a-z', 'string');

preg_match('/A-Z0-9a-z/', 'string');

eregi大文字と小文字を区別しないマッチングの場合、最後の区切り文字の後にiを置きます。例:

eregi('pattern', 'string');

preg_match ('/pattern/i', 'string');
6
Narayan