2

今日は、どの文字列一致アルゴリズムstr_replaceが使用されているかを知る必要があります。PHPソースコードを分析したところ、この関数はext\standard\string.c. 私はちょうど見つけましたphp_char_to_str_ex。この関数がどのアルゴリズムで書かれているのか誰が教えてくれますか? (どのアルゴリズムがstr_replaceこの機能を達成するか) .

そして、日曜日のアルゴリズムを使用したハイライトプログラムを実現したいだけです(非常に高速なアルゴリズムで、このアルゴリズムしかありません)

この関数はおそらく私の目標に合っていると思うstr_replaceので、分析しましたが、私のCはとても貧弱なので、みんなを喜ばせてください。

4

2 に答える 2

7

簡単に言えば、単純な力ずくの検索です。

このstr_replace関数は、実際には への単なるフォワーダphp_str_replace_commonです。そして、サブジェクトが配列ではない単純なケースでは、それが順番に を呼び出しますphp_str_replace_in_subject。繰り返しますが、検索パラメーターが単なる文字列で、それが 1 文字を超える場合、それは を呼び出しますphp_str_to_str_ex

実装を見ると、php_str_to_str_exさまざまな特殊なケースが処理されています。

  1. 検索文字列と置換文字列が同じ長さの場合、結果文字列とソース文字列が同じサイズになることがわかっているため、メモリ処理が容易になります。
  2. 検索文字列がソース文字列よりも長い場合、何も見つからないことがわかっているので、ソース文字列を変更せずにそのまま返すことができます。
  3. 検索文字列の長さがソース文字列の長さと同じである場合、それは単なる比較です。

しかし、ほとんどの場合、次の一致を見つけるために呼び出しを繰り返しphp_memnstr、その一致を に置き換えmemcpyます。

実装に関しては、php_memnstrCmemchrを繰り返し呼び出して検索文字列の最初の文字と一致させmemcmp、残りの文字列が一致するかどうかを確認するだけです。

繰り返しの検索を最適化するための検索文字列の派手な前処理はありません。これは単純な力ずくの検索にすぎません。

サブジェクトが配列であり、検索文字列を前処理する利点がある場合でも、コードは何も変わらないことを付け加えておきます。php_str_replace_in_subject配列内の各文字列を呼び出すだけです。

于 2013-05-30T13:05:24.363 に答える