簡単に言えば、単純な力ずくの検索です。
このstr_replace
関数は、実際には への単なるフォワーダphp_str_replace_common
です。そして、サブジェクトが配列ではない単純なケースでは、それが順番に を呼び出しますphp_str_replace_in_subject
。繰り返しますが、検索パラメーターが単なる文字列で、それが 1 文字を超える場合、それは を呼び出しますphp_str_to_str_ex
。
実装を見ると、php_str_to_str_ex
さまざまな特殊なケースが処理されています。
- 検索文字列と置換文字列が同じ長さの場合、結果文字列とソース文字列が同じサイズになることがわかっているため、メモリ処理が容易になります。
- 検索文字列がソース文字列よりも長い場合、何も見つからないことがわかっているので、ソース文字列を変更せずにそのまま返すことができます。
- 検索文字列の長さがソース文字列の長さと同じである場合、それは単なる比較です。
しかし、ほとんどの場合、次の一致を見つけるために呼び出しを繰り返しphp_memnstr
、その一致を に置き換えmemcpy
ます。
実装に関しては、php_memnstr
Cmemchr
を繰り返し呼び出して検索文字列の最初の文字と一致させmemcmp
、残りの文字列が一致するかどうかを確認するだけです。
繰り返しの検索を最適化するための検索文字列の派手な前処理はありません。これは単純な力ずくの検索にすぎません。
サブジェクトが配列であり、検索文字列を前処理する利点がある場合でも、コードは何も変わらないことを付け加えておきます。php_str_replace_in_subject
配列内の各文字列を呼び出すだけです。