相同的string.replace()在MVC控制器中给出了两个不同的含义

时间:2016-04-26 23:33:36

标签: c# regex asp.net-mvc

我试图在mvc控制器中创建类似 bool 系统堆栈溢出的东西。如果我将最后一个或第一个dobbel星更改为/ *之类的其他东西,那么下面的代码是完美的,但如果我想要两者都相同怎么办? 像第一次**将< B个下一次**将是< / B个。

[HttpPost]
[ValidateInput(false)]
public ActionResult Comment(Models.CommentModel s)
    {

        StringBuilder sbComments = new StringBuilder();
        sbComments.Append(HttpUtility.HtmlEncode(s.comment));

        sbComments.Replace("**", "<b>");
        sbComments.Replace("**", "</b>");
        sbComments.Replace("&lt;b&gt;", "<b>");
        sbComments.Replace("&lt;/b&gt;", "</b>");

        s.comment = sbComments.ToString();

        var db = new WebApplication1.Models.ApplicationDbContext();

        if (ModelState.IsValid)
        {  
            db.Comments.Add(s);
            db.SaveChanges();
            return RedirectToAction("Comment");
        }
        return View(s);
    }

我的解决方案归功于白洋草的回答:

正则表达式可能看起来很复杂,但并不难理解。 这个网站http://regexr.com/让我很难理解这一点。

public ActionResult Comment(Models.CommentModel s)
    {
        Regex fat = new Regex(@"\*\*(.*?)\*\*");
        Regex italic = new Regex(@"_(.*?)_");
        Regex largeText = new Regex(@"#(.*?)#");

        s.kommentar = HttpUtility.HtmlEncode(s.comment);

        s.comment = largeText.Replace(s.comment, "<h1>$1</h1>");
        s.comment = fat.Replace(s.comment, "<b>$1</b>");
        s.comment = italic.Replace(s.comment, "<i>$1</i>");

        //this is the database I am adding my comments to
        var db = new WebApplication1.Models.ApplicationDbContext();

        if (ModelState.IsValid)
        {    
            db.Comments.Add(s);
            db.SaveChanges();
            return RedirectToAction("Comment");
        }
        return View(s);
    }

无法找到Regex()?请务必在页面顶部添加using System.Text.RegularExpressions;库。

2 个答案:

答案 0 :(得分:2)

您可以使用此扩展程序:

public static string replaceHipHip(this string text, string old, string hip, string hop)
{
    var result = new StringBuilder();
    bool b = true;
    int i = 0;
    while(i>=0)
    {
        int j = text.IndexOf(old, i);
        if (j == -1)
        {
            result.Append(text.Substring(i));
            break;
        }
        else
        {
            result.Append(text.Substring(i, j - i));
            if (b)
                result.Append(hip);
            else
                result.Append(hop);

            b ^= true;
            i = j+old.Length;
        }
    }
    return result.ToString();
}

然后你可以写:

string text = "Hello **this** is a **dummy** text";
Console.WriteLine(text.replaceHipHip("**", "<b>", "</b>"));

哪个输出:

  

您好虚拟文字

答案 1 :(得分:1)

您可以尝试使用正则表达式进行替换,如下所示:

Regex regexb = new Regex("\*\*(.*?)\*\*");
string comment = regexb.Replace(HttpUtility.HtmlEncode(s.comment), "<b>$1</b>");

希望这可以提供帮助