1

次の形式の一連の文字列があります。

{ method_name { $key1 = 'quoted value' , $key2 = __('literal value'); }}

// Missing method_name and final semi-colon
// Still valid
{{ $key1 = 'quoted value' , $key2 = __('literal value') }}

// Optional key values
{ method_name { $key1 = , $key2 = __('literal value'); }}
{ method_name { $key1, $key2 = __('literal value'); }}

// Any number of values
{ method_name { $key1 = 'quoted value' , $keyN = 3.14; }}

現在、一連のpreg_splitとを使用していtrimます。これはカスタム テンプレート エンジンの一部であり、method_nameどのメソッドを呼び出すかをパーサーに通知$key = valueし、配列としてメソッドに渡されます。これらの文字列は HTML テンプレートに埋め込まれ、その DOM 構造が繰り返される場合があります。各行/列が異なる値を持つテーブルと考えてください。キーは列の詳細 (名前、ソート可能など) であり、メソッドはセルの詳細を入力します。

私が抱えている問題は速度です。

Q1. 単一の式でこれを行うにはどうすればよいですか?

Q2. 速度が上がるでしょうか?

Q3. 結果をキャッシュする場合、やや複雑な正規表現よりも読みやすさが優先されますか?

Q4. パフォーマンスを向上させるために文字列を再構築する方法はありますか?

理想的には、文字列を 1 回だけスキャンし、それを PHP コードに変換し、eval使用する必要があるたびに実行したいと考えています。

4

2 に答える 2

1

おそらく、次のような正規表現を使用します(コメントの部分から単純化する部分をいくつか見つけました):

(?:\{ (?:(?<method>.+?)\s+\{)?|\G)[,\s]*(?<key>\$\w+)(?: = (?<value>[^,\n;}]*))?

名前付きのキャプチャ グループは一目瞭然ですが、内訳は次のとおりです。

(?:
    \{ 
    (?:
        (?<method>.+?)   # Captures everything until the next { for the method
        \s+\{       
    )?                   # All this optional
    |
    \G                   # Or \G anchor, which will allow successive match of multiple key/value pairs
)
[,\s]*                   # Any spaces and commas
(?<key>\$\w+)            # Capture of key with format $\w+
(?: = 
    (?<value>[^,\n;}]*)  # Capture of value
)?                       # All this optional

正規表現101のデモ

于 2013-10-09T20:15:29.770 に答える
0

あなたのパフォーマンスに関する懸念は見当違いかもしれません。正規表現のマッチングに時間がかかっているようです。おそらく、あなたが持っているプログラムは、あなたが望むよりも時間がかかっています.

正規表現が実際に速度の問題の原因であることが判明するまでは、正規表現を最適化しないでください。その場合は、XDebugなどのコード プロファイラーを使用してプログラムを分析し、何が遅いかを示すレポートを作成する必要があります。

プログラムの実行に 20 秒かかり、そのうちの 2 秒が正規表現に費やされることがあります。正規表現マッチングの実行時間を半分に短縮したとしても、1 秒、つまり実行時間の 5% しか節約できません。

コードのどの部分に最も多くの時間が費やされているかを知らずにコードを高速化しようとするのは、最適化が時期尚早です。

于 2013-10-09T19:51:22.980 に答える