17

私はしばらく PHP でコーディングしてきましたが、パフォーマンスが低下するため、必要な場合にpreg_matchのみ使用する必要があることを読み続けています。preg_replaceどうしてこれなの?preg_matches別の PHP 関数を使用する代わりに、1 つのファイルで20 を使用するのは本当に悪いことでしょうか。

4

6 に答える 6

17

Mike Brantが彼の答えで言ったように、必要に応じてpreg_*関数を使用しても問題はありません。 正直なところ、1つのファイルに20回の呼び出しを含めるのが良いかどうかを知りたいと思います。それは多すぎると思います。「問題の解決策が常に3つ以上の正規表現に依存している場合、あなたは問題の一部である」とよく言います。しかし、私は時々自分のマントラに反して罪を犯しました。
preg_match

20回の呼び出しを使用している場合preg_match、実際の正規表現を詳しく調べるだけで、その数を半分にできる可能性があります。正規表現、特にPerl正規表現は非常に強力であり、時間をかけて知る価値があります。それらが遅くなる傾向がある理由は、正規表現を解析し、低レベルでかなりの数のブランチとループに「変換」する必要があるためです。たとえば、すべての小文字を大文字の文字に置き換えたい場合aは、確かに正規表現を使用できますが、PHPでは次のようになります。

preg_replace('/a/','A',$string);

最初の引数である式を見てください。これは、引数として渡される文字列です。この文字列は解析されます(解析時に区切り文字がチェックされ、一致する文字列が作成されてから文字列が繰り返され、各文字がパターン(この場合a)と比較され、部分文字列が一致する場合は置き換えられます
。特に最後のステップ(サブストリングの比較と一致の置換)が私たちが本当に望んでいるすべてであることを考えると、少し面倒です。

$string = str_replace('a','A',$string);

正規表現が解析および検証されるときに実行される追加のチェックなしで、まさにそれを行います。一致の配列も作成する
ことを忘れないでください。配列の作成も無料ではありません。preg_match

つまり、式が解析され、検証され、最終的に一連の単純な低レベルの命令に変換されるため、正規表現は遅くなります。

場合によっては、文字列の操作にをexplode使用することに注意してください。implodeこれもまた、自由ではない配列を作成します。その後まもなく、まったく同じ配列を内破していることを考慮してください。おそらく、別のオプションの方が望ましいでしょう(場合によってpreg_replace 、ここでより高速になることもあります)。
基本的に:正規表現には追加の処理が必要ですが、単純な文字列関数では必要ありません。しかし、疑わしい場合は、絶対に確信できる唯一の方法があります。テストスクリプトを設定することです...

于 2013-01-15T17:10:17.560 に答える
9

問題がない限り、最適化について心配する必要はありません。

XDebug(http://xdebug.org)のようなもので測定せずに、最適化の領域を探しないでください。

コードをpreg_match()で実行するのに100ミリ秒かかり、他のメソッドで110ミリ秒かかる場合、違いを本当に気にしますか?

最初に正確さと明確さを書いてから、速度を検討してください。

于 2013-01-15T16:56:44.257 に答える
6

それは本当にあなたのユースケースに依存します。正規表現を使用することについて本質的に「悪い」ことは何もありません。場合によっては、特定の問題に対する唯一の解決策になることもあります。ただし、単純な文字列操作関数が問題なく機能する場合もあります。これらは関数よりも高速になる傾向があるpreg*ため、非常に頻繁に実行されるスクリプトがある場合や、実行する文字列操作が多数ある場合に、正規表現を使用することの影響が感じられるようになる可能性があります。

どんな場合でもそうであるように、アプリケーションと環境でテストし、何が最適かを判断する必要があります。

于 2013-01-15T16:43:47.333 に答える
3

あなたがしていることに依存します。複雑な正規表現の場合はpreg_関数を使用します。単純な置換などが必要な場合は、str_replace()、strpos()、strstr()などの他のより具体的な関数を使用します。

Webには、http://www.simplemachines.org/community/index.php?topic=175031.0のような議論がたくさんあります。

于 2013-01-15T16:44:55.067 に答える