21
if (strpos(htmlentities($storage->getMessage($i)),'chocolate')) 

こんにちは、私はgmail oauthアクセスを使用して、メールアドレス内の特定のテキスト文字列を検索しています。上記のコードでstrposを使用するよりも迅速かつ効率的にテキストインスタンスを見つける方法はありますか?ハッシュ手法を使用する必要がありますか?

4

3 に答える 3

33

PHPのマニュアルによると、yes-strpos()は、ある文字列に別の文字列が含まれているかどうかを判断する最も簡単な方法です。

ノート:

特定の針が干し草の山の中で発生するかどうかだけを判断したい場合は、代わりに、より高速でメモリ消費の少ない関数strpos()を使用してください。

これは、他の文字列コンパレータに関するphp.netの記事で何度も引用されています(私はこれをから引き出しましたstrstr()

あなたの声明に加えられるべき2つの変更がありますが。

if (strpos($storage->getMessage($i),'chocolate') !== FALSE)

これは、if(0)falseと評価される(したがって実行されない)ためですがstrpos()、針が干し草の山の最初(位置0)にある場合は0を返す可能性があります。また、削除するhtmlentities()とコードの実行が大幅に高速化されます。これhtmlentities()は、特定の文字を適切なHTMLに置き換えるだけです。たとえば、すべて&をに置き換えます&

ご想像のとおり、文字列内のすべての文字を個別にチェックし、それらの多くを置き換えるには、余分なメモリとプロセッサの能力が必要です。それだけでなく、テキスト比較だけを行う場合は不要です。たとえば、次のステートメントを比較します。

strpos('Billy & Sally', '&'); // 6
strpos('Billy & Sally', '&'); // 6
strpos('Billy & Sally', 'S'); // 8
strpos('Billy & Sally', 'S') // 12

または、最悪の場合、trueをfalseと評価することもできます。

strpos('<img src...', '<'); // 0
strpos('&lt;img src...','<'); // FALSE

これを回避するには、さらに多くのHTMLエンティティを使用することになります。

strpos('&lt;img src...', '&lt;'); // 0

しかし、ご想像のとおり、これはコーディングに煩わ​​しいだけでなく、冗長になります。HTMLエンティティを完全に除外することをお勧めします。通常、HTMLエンティティは、テキストを出力する場合にのみ使用されます。比較していません。

于 2010-10-06T17:26:45.190 に答える
2

strposはpreg_matchやこの場合の代替案よりも高速である可能性が高いため、実際のサンプルデータを使用して独自のベンチマークを実行し、ニーズに最適なものを確認することをお勧めします。問題が発生し始めるまで、パフォーマンスについてあまり心配する必要はありません。

于 2010-10-06T15:31:45.233 に答える
1

strposは、文字列の最初の出現の開始位置を返します。一致がない場合はNullを返すため、ステートメントはかなり使用可能です。

if (!is_null(strpos($storage->getMessage($i),'chocolate'))
于 2018-09-26T13:18:53.213 に答える