2017-03-01 80 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

正则表达式将为您解决这个问题。

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

使用正则表达式会做的伎俩repl.it demo

  1. "\[ARTICLEIMAGE:\d+?:\d+?\]"
  2. \[逃脱[人物。括号内是特殊字符正则表达式中
  3. \d任何数字
  4. \d+?:+是0或多个数字。直到我们找到冒号:。这个?指非贪婪和真的不需要......
  5. \]逃脱右括号

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

谢谢@Joe - 这真是太棒了。我只是为了解它的工作原理而挠了挠头。如果我想添加另一个表示包含不同格式日期的令牌说明怎么办?例如:“

[Date:mm/dd/yyyy]
[ARTICLEIMAGE:72:50]
”我可以使用相同的方法来替换和格式化该日期,还是只是在d +上点击? – blair260

+0

另外 - 格式化日期可以使用类似的语法吗? – blair260

+0

是的,如果原始格式已知,通常使用正则表达式对日期进行分析。用于替换的'\ [日期:\ d \ d \ d \ d \ d \ d \ d \ d \]'和匹配月份,日期和年份的“\ d {2.4}”' – Joe