POSIX正規表現(ereg) はPHP 5.3.0以降廃止されるため、古い表現を PCRE(Perlに変換する簡単な方法を知りたい互換性のある正規表現)(preg) 。
たとえば、次の正規表現があります。
eregi('^hello world');
式をpreg_match
互換式に変換するにはどうすればよいですか?
注:この投稿は、eregからpregへの変換に関連するすべての投稿のプレースホルダー、および関連する質問の重複オプションとして機能します。この質問を閉じないでください。
関連:
構文の最大の変更点は、 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
Preg(PHP 5.3.0以降)でのEregの置き換えは、私たちにとって有利な動きでした。
perl互換の正規表現構文を使用するpreg_matchは、多くの場合eregのより高速な代替手段です。
eregパターンをpregに移植するための4つの主要なことを知っている必要があります:
区切り文字を追加(/):'pattern' => '/pattern/'
エスケープ区切り文字パターンの一部である場合:'patt/ern' => '/patt\/ern/'
次の方法でプログラムで達成します。$old_pattern = '<div>.+</div>';
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
eregi(大文字と小文字を区別しないマッチング):'pattern' => '/pattern/i'
したがって、大文字と小文字を区別しないマッチングにeregi関数を使用している場合は、新しいパターンの末尾に 'i'を追加するだけです( '/ pattern /' )。
ASCII値:eregでは、パターンで数値を使用する場合、文字のASCIIを参照していると見なされます。ただし、pregでは、数値はASCII値として扱われません。そのため、パターンのereg式にASCII値が含まれている場合(たとえば、改行、タブなど)、それを16進数に変換し、接頭辞\ xを付けます。Example: 9(tab) becomes \x9 or alternatively use \t.
ereg()
とpreg_replace()
には、単なる構文よりも多くの違いがあります。
戻り値:
FALSE
を返しますereg()
はFALSE
を返し、preg_match()
は0
を返しますereg()
は文字列の長さを返す、または1
、preg_match()
は常に1
を返します一致する部分文字列の結果の配列:部分文字列がまったく見つからない場合(...a(b)?
の(b)
)、ereg()
結果の対応するアイテムはFALSE
になりますが、preg_match()
それはまったく設定されません。
ereg()
をpreg_match()
に変換するだけの勇気がない場合は、 mb_ereg() を使用できます。これはPHPで引き続き利用可能です_ 7。
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');