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


140

以来POSIX正規表現(EREG)は PHP 5.3.0以降廃止されて、私は古い表現に変換する簡単な方法を知っているしたいと思いPCRE(Perl互換正規表現)(PREGを)

例として、私はこの正規表現を持っています:

eregi('^hello world');

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

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

関連:


2
@ yes123:はい、それがポイントです。私もそれにうんざりしています。私は実際に何かを説明するwikiの投稿が欲しいので、これらの個々の質問をすべて閉じることができます。
netcoder

古いものを区切り文字でラップする必要があるだけなので、これは必要ないと思います。また、これについては以前に回答された質問を使用できたと思います。
動的

ああ、コメントを読む前に閉会に投票しました。プレースホルダーとしてそれは目的を果たすことができますが、そのように役立つことができた別の古い質問はありませんか?
Wrikken

うーん、確かに。ereg [php]あまり有用な結果は得られません。わかりました、これを私のサポートに貸してください。
Wrikken

8
皆さん、私たちはこのトピックに関する閉じた質問の輪をほぼ作成しているようです。このレートでは、すべて閉鎖されます:)
Kev

回答:


142

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

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

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

あなたはへの完全なリファレンス見つけることができますマニュアルのPHPでPCREの構文だけでなく、違いのリスト表現を変換する助けにPOSIX正規表現とPCREの間を。

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

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

2
素晴らしい説明!eregからpreg_matchに変換する特別なケースを追加したいのですが、デリミタのみをエスケープする必要があり、予約文字はエスケープする必要がありません(それらはすでに特殊文字として機能していたため、エスケープしたくありません) : preg_match( '/'。str_replace( '/'、 '\ /'、$ expr)。 '/'、$ str);
Lolito 2013年

一致する角かっこを使用する場合、例のような他の記号の場合のように、「区切り文字と同じだからといって」文字をエスケープする必要がないことに特に注意してください/^\/hello/(a(b)c)完全に有効な区切られたPCREです。私は個人的に、括弧を使用し()て、最初にキャプチャされたマッチがすべてであることを思い出させます。
Niet the Dark Absol 2017年

私は言うことができます、私はPHPが大嫌いです!(それだけです。他にはありません。)共有Webホスティングサーバーが新しいバージョンに更新され、error_logsが次の警告でいっぱいになったときに、これらの回答を検索する必要がありますPHP Deprecated: Function ereg() is deprecated in...。ああ!
c00000fd 2017

これを変換する方法?$ regex = $ e。'((\。[^​​ \。'。$ e。 '] [^'。$ e。 '] *)|(\。\。[^'。$ e。 '] +)|([^ \。 ] [^ '。$ e。'] *)) '。$ e。'\。\。' 。$ e; preg_mathに/修飾子/を追加するだけでは機能しません/
bdalina

32

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.


8

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');

7

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

  • 戻り値:

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

一つは、彼または彼女に変換する勇敢十分でない場合ereg()にはpreg_match()、彼または彼女は使用することができますmb_eregを() PHP 7でまだ利用可能ですが、。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.