Deprecated: Function ereg_replace()、eregi() is deprecated 等のPHPエラーを解決する

Deprecated: Function ereg_replace() is deprecated in /home/dacelo/public_html/hoge.php on line 1234

Deprecated: Function eregi() is deprecated in /home/dacelo/public_html/hoge.php on line 1234

このページを見ているあなたは、これまで調子よく使っていたどこかのPHPスクリプトに、ある日こんなエラーが大量に発生して焦っているはずです。大丈夫、落ち着いてください。

あなたはおそらく、最近サーバー関連で何かをしたはずです。
・サーバーを引っ越した
・サーバーのPHPのバージョンが上がった

実は、このereg系の関数は、軒並みPHP5.3.0以降で非推奨となっていて、6.0では廃止されることになっています。

警告。かなり強い調子です。

php6で廃止されるereg系関数一覧

  • ereg()
  • ereg_replace()
  • eregi()
  • eregi_replace()
  • split()
  • spliti()

eregはPOSIX拡張ということで今後は廃止、これからはPerl互換(PCRE関数)のpreg系を使うべし、ということになっています。

このことは2010年には告知されていたので、おそらく、最近書かれたPHPプログラムだと普通はpreg系を使っているはず。つまりお使いのPHPプログラムは結構前に書かれた古いコードなのだろうと思います。

ereg系の代わりに使うpreg系

それぞれ、次の関数で代替します。

  • ereg() → preg_match()
  • ereg_replace()→ preg_replace()
  • eregi()→ preg_match(//i)
  • eregi_replace()→ preg_replace(//i)
  • split() → preg_split()
  • spliti() → preg_split(//i)

大文字小文字を区別しない「i」の扱いが、ereg系では別関数なのに対し、preg系では同じ関数の引数の中で区別する、という違いがあります。

他にもパターンのくくり方などが違うので、そのまま関数名を置き換えただけでは動作しません。

書き換え方の実例

文字列phpを探す

eregの場合
if (ereg("PHP", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
}
preg_matchの場合
if (preg_match("/PHP/", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
}
eregiの場合
if (eregi("php", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
}
preg_match(//i)の場合
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
}

文字列htmlをphpに置換する

ereg_replaceの場合
$str = ereg_replace("html", "php", "html is the markup language.");
preg_replaceの場合
$str = preg_replace("/html/", "php", "html is the markup language.");

また、ereg系で”http://”などスラッシュを使ったパターンがあった場合、
Warning: preg_replace() [function.preg-replace]: Unknown modifier ‘/’ in …
のエラーになりますので、
“http:\/\/”
のようにバックスラッシュでエスケープしておく必要があります。
もしくは、デリミタを//ではなく{}にする、という方法もあるので覚えておいてください。

広告

About: dacelo


Leave a Reply

Your email address will not be published. Required fields are marked *