2017-03-01 9 views
0

私はオブジェクトにテンプレートを適用していますが、検索と置換の機能を使用してテンプレートをhtmlの文字列。問題は、画像の高さと幅がトークンに含まれているため、変化する可能性があるため、検索して置換する方法がないことです。値で始まるac#文字列内のトークンの検索と置換方法

トークン値は[ARTICLEIMAGE:150:200]である

foreach(var article in articles) { 
    var articleTemplateValue = _TemplateArticleMarkup; 
    articleTemplateValue = articleTemplateValue.Replace("[ARTICLEIMAGE:xx:yy]", "<img src=" + article.ArticleImageFolder + "/" + article.ArticleImage + " title=" + article.ArticleTitle + " width=" 
     xx" height=" 
     yy" />"); 
} 

画像トークンの寸法が変化するであろうように、これは明らかに、すべての例では動作しないであろう。 StartsWithとしてトークンを見つけて、次に次元の配列を分割する方法はありますか?もしそれがちょっと混乱しているような意味があるのであれば教えてください。ありがとう!

答えて

1

Regexがこの問題を解決します。

using System.Text.RegularExpressions; 

次に、コードを以下のように変更します。

foreach (var article in articles) 
{ 
    string articleTemplateValue = _TemplateArticleMarkup; 

    MatchCollection mc = Regex.Matches(articleTemplateValue, @"\[ARTICLEIMAGE\:(\d+)\:(\d+)\]"); 

    if (mc.Count > 0) 
    { 
     string toReplace = mc[0].Value; 
     string xx = mc[0].Groups[1].Value; 
     string yy = mc[0].Groups[2].Value; 

     articleTemplateValue = articleTemplateValue.Replace(toReplace, "<img src=\"" + article.ArticleImageFolder + "/" + article.ArticleImage + "\" title=\"" + article.ArticleTitle + "\" width=\"" + xx + "\" height=\"" + yy + "\"/>"); 
    } 
} 
+0

完璧で、他のアプローチがうまくいっている間に、これは私のアプリケーションに少しだけ良くフィットします。助けてくれてありがとう! – blair260

1

Split()コマンドを使用すると、幅と高さを見つけることができます。非常にラフなアプローチは、以下:

rextester remo

String articleTemplateValue = "[test:40:200]"; 

Console.WriteLine(articleTemplateValue); 

var arr = articleTemplateValue.Split(':'); 
if (arr.Length == 3) { 
    var xx = arr[1]; 
    var yy = arr[2].Substring(0, arr[2].Length - 1); 

    articleTemplateValue = articleTemplateValue.Replace(articleTemplateValue, "<img src=" 
     + "folder" + "/" + "image" + " title=" + "ArticleTitle" + " width="+ xx + " height= " + yy+ "/>"); 

    Console.WriteLine(articleTemplateValue); 
} 
+0

giorgos-altanis @おかげで、これは、単純な画像のための素晴らしい作品が、私のような私のテンプレート内に追加のトークンとマークアップあったら何 -

[test:40:200]
[POSTEDDATE:mm/dd/yyyy]
を私はrextesterにそれを果たしたとき、それは正しくレンダリングされません。 – blair260

+0

次に、別の問題があります:-)とにかく、正規表現のアプローチははるかにエレガントで「経済的」です。 –

0

使用正規表現は、[文字をエスケープトリックに

  • "\[ARTICLEIMAGE:\d+?:\d+?\]"
  • \[repl.it demo

      を行うだろう。ブラケットは正規表現
    1. \d
    2. \d+?:+は0以上の数字ある任意の数字に特殊文字です。コロンが見つかるまで:。 ?
    3. を使用して閉じ括弧

    var matches = Regex.Match(articleTemplateValue, @"\d+"); 
        var xx = matches; 
        var yy = matches.NextMatch(); 
        var template = "<img src=" + article.ArticleImageFolder + "/" + article.ArticleImage + " title=" + article.ArticleTitle + " width=" 
         + xx + " height=" 
         + yy + " />"; 
        articleTemplateValue = articleTemplateValue = Regex.Replace(articleTemplateValue, @"\[ARTICLEIMAGE:\d+?:\d+?\]", template); 
    

    を脱出\] ...非欲張り意味し、本当に必要ありません

  • +0

    ありがとう@ジョー - これは素晴らしいです。私はちょうどそれがなぜ機能するか私の頭部をちょうど傷つける。もし私が別のトークンを追加したいのであれば、それは様式を変えることを含む日付を表していました。例: "

    [Date:mm/dd/yyyy]
    [ARTICLEIMAGE:72:50]
    "同じ方法を使用して、その日付を置き換えてフォーマットすることができますか、それともd +をヒットするだけですか? – blair260

    +0

    また、同様の構文で日付をフォーマットすることができますか? – blair260

    +0

    はい、元の形式がわかっていると、日付は通常Regexで解析されます。 \ d {\ d \ d \ d \ d \ d \ d \ d \ d /]を置き換え、\ d {2.4} "を月、日、年と一致させるには' \ [日付:\ d \ d/\ d \ d /] 'に設定します。 – Joe

    関連する問題