0

{Substitution:GetNonCachedData}キャッシュされるべきではないデータを取得するような構文を使用するカスタム ページ キャッシュ ユーティリティを構築しています。ソリューションは組み込みのものと非常に似ています<@ OutputCache %>が、それほど柔軟ではありません (必要ありません)。最も重要なことは、キャッシュされていないデータを取得するときにセッション状態を利用できるようにすることです。

とにかく、HTML のトークンを {Substitution} タグで指定された静的メソッドの結果に置き換えるメソッドがあります。

たとえば、私のページ:

<html>
    <body>
      <p>This is cached</p>
      <p>This is not: {Substitution:GetCurrentTime}</p>
    </body>
</html>

{Substitution:GetCurrentTime}静的メソッドの結果を入力します。処理が行われる場所は次のとおりです。

private static Regex SubstitutionRegex = new Regex(@"{substitution:(?<method>\w+)}", RegexOptions.IgnoreCase);

public static string WriteTemplates(string template)
{
    foreach (Match match in SubstitutionRegex.Matches(template))
    {
        var group = match.Groups["method"];
        var method = group.Value;
        var substitution = (string) typeof (Substitution).GetMethod(method).Invoke(null, null);
        template = SubstitutionRegex.Replace()
    }

    return template;

}

変数templateは、置換する必要があるカスタム トークンを含む html です。この方法の問題はtemplate、更新された html で変数を更新するたびに、変数に追加された文字が増えmatch.Indexたため、変数が正しい文字の開始点を指しなくなることです。template

文字数などをカウントするか、その他のスクリューボールの方法で機能するソリューションを思いつくことができますが、最初に、Regex オブジェクトでこれを実現する簡単な方法がないことを確認したいと思います。誰でもこれを行う方法を知っていますか?

ありがとう!

4

2 に答える 2

1

デリゲートRegex.Replaceを取るオーバーロードを呼び出す必要があります。MatchEvaluator

例えば:

return SubstitutionRegex.Replace(template, delegate(Match match) {
    var group = match.Groups["method"];
    var method = group.Value;
    return (string) typeof (Substitution).GetMethod(method).Invoke(null, null);
});
于 2010-08-05T18:13:20.137 に答える
0

Matches を使用して結果をループする代わりに、正規表現をコンパイル済みに設定し、一致が停止するまで while ループで単一の Match を使用します。

于 2010-08-05T18:14:07.640 に答える