8

私は大規模な PHP アプリケーション (> 100 万行、10 年前) に取り組んでおり、現在 516 クラスで 1,768 の一意の正規表現を幅広く使用していeregますereg_replace

が非推奨になっている理由は十分に承知していますeregが、明らかに移行にpreg大きく関与する可能性があります。

eregPHP でサポートが維持される可能性が高い期間を知っている人はいますか?またpreg、この規模で移行するためのアドバイスはありますか? ereg から preg への自動変換は不可能/非現実的だと思いますか?

4

4 に答える 4

2

いつ削除されるかはわかりませんeregが、私の賭けは PHP 6.0 の時点です。

ereg2 番目の問題 (に変換preg) については、それほど難しいことではないようです。アプリケーションの行数が 100 万行を超える場合、誰かにこの仕事をせいぜい 1 週間実行させるだけのリソースが必要です。コード内のすべてのインスタンスを grep しereg_、お気に入りの IDE でいくつかのマクロをセットアップします (区切り文字、修飾子などの追加などの単純なもの)。

1768 の正規表現のほとんどは、マクロを使用して移植できるに違いありません。

ereg別のオプションとして、関数が使用できない場合は関数の周りにラッパーを記述し、必要に応じて変更を実装することもできます。

if (function_exists('ereg') !== true)
{
    function ereg($pattern, $string, &$regs)
    {
        return preg_match('~' . addcslashes($pattern, '~') . '~', $string, $regs);
    }
}

if (function_exists('eregi') !== true)
{
    function eregi($pattern, $string, &$regs)
    {
        return preg_match('~' . addcslashes($pattern, '~') . '~i', $string, $regs);
    }
}

あなたはアイデアを得る。また、PEAR パッケージの PHP Compatも実行可能なソリューションになる可能性があります。


POSIX 正規表現との違い

PHP 5.3.0 の時点で、POSIX Regex 拡張は非推奨になりました。POSIX 正規表現と PCRE 正規表現には多くの違いがあります。このページでは、PCRE に変換する際に知っておく必要がある最も注目すべきものをリストします。

  1. PCRE 関数では、パターンを区切り文字で囲む必要があります。
  2. POSIX とは異なり、PCRE 拡張機能には大文字と小文字を区別しない一致専用の関数はありません。代わりに、これは /i パターン修飾子を使用してサポートされています。マッチング戦略を変更するために、他のパターン修飾子も利用できます。
  3. POSIX 関数は左端の一致のうち最長のものを見つけますが、PCRE は最初の有効な一致で停止します。文字列がまったく一致しない場合は違いはありませんが、一致する場合は、結果の一致と一致速度の両方に劇的な影響を与える可能性があります。この違いを説明するために、Jeffrey Friedl による「Mastering Regular Expressions」の次の例を検討してください。パターン one(self)?(selfsufficient)? の使用 文字列 oneselfsufficient に対して PCRE を使用すると一致する oneself になりますが、POSIX を使用すると結果は完全な文字列 oneselfsufficient になります。両方の (サブ) 文字列は元の文字列と一致しますが、POSIX では最長のものを結果にする必要があります。
于 2011-05-03T14:56:21.133 に答える
2

私の直感では、意図的に削除することは決してないと言っていますereg。PHP は、登録グローバルのような非常に古く非推奨のものをまだサポートしています。時代遅れのアプリが多すぎます。ただし、誰かが深刻な脆弱性を発見し、それを修正する人がいないため、拡張機能を削除する必要がある可能性はほとんどありません.

いずれにせよ、次の点に注意してください。

  1. PHP インストールをアップグレードする必要はありません。従来のアプリを実行するために古いサーバーを維持することはよくあることです。

  2. PHP_Compat PEAR パッケージは、いくつかのネイティブ関数のプレーンな PHP バージョンを提供します。がereg消えても、追加される可能性があります。


ところで...実際、PHP 6は死んでいます。彼らは、PHP を完全に Unicode に準拠させるアプローチが思ったより難しいことに気づき、すべてを再考しています。結論は、完全な予測は決してできないということです。

于 2011-05-03T15:12:32.367 に答える
1

私はこの問題をはるかに小規模で、つまり 10,000 行に近いアプリケーションで抱えていました。いずれの場合もpreg_replace()、正規表現パターンに切り替えて区切り文字を配置するだけで済みました。

誰でもできるはずです。プログラマーでなくても、ファイル名と行番号のリストを与えることができます。

次に、テストを実行して、修正可能な障害を監視します。

ちなみに、ereg 関数は PHP6 から削除されます - http://jero.net/articles/php6

于 2011-05-03T14:59:44.140 に答える
0

すべてのereg関数は PHP 6 で削除されると思います。

于 2011-05-03T14:55:52.113 に答える