4

私はいくつかのコードを見ていて、preg_replace.

まず第一preg_replaceに、このタスクを最初に使用するのはやり過ぎであり、不必要にコストがかかる可能性があり、PHP の文字列に適した関数 ( substr. 私はこれを知っています。

とはいえ、次の 2 つの異なる正規表現を検討してください。

$uri = '/one/cool/uri';    // Desired result '/one/cool'

// Using a back-reference
$parent = preg_replace('#(.*)/.*#', "$1", $uri);

// Using character class negation
$parent = preg_replace('#/[^/]+$#', '', $uri);

デフォルトでは、前者の場合、後方参照を作成すると作成しない場合よりもコストがかかるため、2 番目の例が望ましいと思います。しかし、その後、2 番目の例で使用すると、最初の例で[^/]対応するものよりもコストがかかるのではないかと考え始めました。.

私は読みやすさの観点から最初の例を好みます。私たちは髪を分割しているので、2 つの間で選択する傾向があります (結局のところ、読みやすいコードを書くことにも価値があります)。ただ、私の個人的な好みかもしれません。

考え?

4

1 に答える 1

2

また、両方のオプションの実行時間を測定します。ドキュメントからのこの情報も役立つ場合があります。

http://www.php.net/manual/en/regexp.reference.performance.php

改行を含まないサブジェクト文字列でこのようなパターンを使用している場合、最高のパフォーマンスは、PCRE_DOTALL を設定するか、パターンを ^.* で開始して明示的なアンカーを示すことによって得られます。これにより、PCRE は件名に沿ってスキャンして再開する改行を探す必要がなくなります。

したがって、$parent = preg_replace('#^(.*)/.*#s', "$1", $uri);最初のオプションを高速化できます。2 番目のものは、この設定を必要としません。

s (PCRE_DOTALL)

この修飾子が設定されている場合、パターン内のドット メタ文字は、改行を含むすべての文字に一致します。それがない場合、改行は除外されます。この修飾子は、Perl の /s 修飾子と同等です。[^a] などの否定的なクラスは、この修飾子の設定に関係なく、常に改行文字に一致します。

于 2012-11-30T23:28:09.727 に答える