web-dev-qa-db-ja.com

php-strposは、大量のテキスト内の文字列を検索するための最速の方法ですか?

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

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

18
Bob Cavezza

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

注:

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

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

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

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

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

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

_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エンティティは、テキストを出力する場合にのみ使用されます。比較していません。

29
stevendesu

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

2
neopickaze

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

if (!is_null(strpos($storage->getMessage($i),'chocolate'))
0
kingunits