【问题标题】:Replace 3 characters in a string with 3 new values用 3 个新值替换字符串中的 3 个字符
【发布时间】:2014-02-28 14:51:50
【问题描述】:

我想用它们各自的 html 实体替换版权符号的实例。现在,版权符号只是直接复制到产品名称中,所以现在,当我发送包含完整订单摘要的电子邮件时,版权符号显示为“?”反而。我需要在字符串中查找 (c)、(R) 和 TM 版权符号,并将每个符号替换为正确的 HTML 实体代码。但是,我不确定如何执行这样的 String.Replace()(搜索 3 个字符并用 3 个新值替换它们对我来说似乎很复杂)

这是设置电子邮件的代码(现在我只检查 (R) 符号):

protected void sendEmail()
    {
        Item CurrentItem = Sitecore.Context.Item;
        Item HomeItem = ScHelper.FindAncestor(CurrentItem, "gojoOrderReview");
        if (HomeItem != null)
        {
            TextBox rTxt = (TextBox)FindControl("rEmail");
            TextBox fName = (TextBox)FindControl("yName");
            Literal lit = (Literal)FindControl("emailTbl");
            //string html = lit.Text;

                try
                {
                    //.Value = string.Format("<tr><td style="width:80px;">{0}</td><td style="width:50px;">{1}</td><td style="width:20px;>{2}</td><td style="width:20px;>{3}</td><td style="width:60px;>{4}</td></tr>", SkuItem.Fields["Order Number"].Value, SkuItem.Fields["Description"].Value, qtyAmt);
                    System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
                    msg.To.Add(rTxt.Text);
                    msg.Subject = "GOJO product order summary";
                    msg.From = new System.Net.Mail.MailAddress("donotreply@GOJO.com");
                    msg.Body = "Here is a list of the products your friend, " + fName.Text + ", has selected: ";
                    msg.IsBodyHtml = true;

                    msg.Body += "<h1></h1>";
                    msg.Body += "<table cellpadding='4' cellspacing='0' border='1px solid black' style='padding: 4px 0 4px 0; border-collapse: collapse; width:750px; text-align: left; font-family: sans-serif;'><tr><th></th><th>Product</th><th>GOJO SKU</th><th>Size</th><th>Case Pack</th><th>Quantity</th></tr>";
                    msg.Body += lit.Text.ToString().Replace("®", "&reg;") +"</table>";



                    System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient("mail.innismaggiore.com");
                    sc.Send(msg);
                }
                catch (Exception EX)
                {
                    GOJOHelper.WriteLog("GOJO Order Review - sendEmail()", EX.ToString());
                }

        }
    }

下面是创建 lit 变量文本值的代码:

lit.Text += string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td><td>{5}</td></tr>",  drow["Thumbnail"], CPNItem["Complete Name"], marketItem.Fields["SKU"].Value, drow["Size"].ToString(), marketItem.Fields["Case Pack"].Value, qtys.ToString());

【问题讨论】:

  • 您可以将调用链接到 String.Replace。对于这类问题,正则表达式会带来更多麻烦。
  • 你不应该链接String.Replace调用,因为每个调用都会遍历原始字符串并创建一个新字符串。
  • 考虑使用StringBuilder 来构建body body。每个字符串 += 连接都会产生一个新字符串。
  • 是的,确实如此,但大多数时候性能影响可以忽略不计。

标签: c# html regex replace html-entities


【解决方案1】:

如果你想对这种字符进行编码,你应该使用 html 编码器。

在 C# 中,你可以使用这个:

string result = System.Web.HttpUtility.HtmlEncode("Sample string ©");

如果要逐个替换每个字符,可以使用 Sudhakar Tillapudi 的代码。他的回答是有效的,但你要做很多替换。

网站 DotNetPerls 有一个 good exampleHtmlEncode

using System;
using System.Net;

class Program
{
    static void Main()
    {
        string a = WebUtility.HtmlEncode("<html><head><title>T</title></head></html>");
        string b = WebUtility.HtmlDecode(a);

        Console.WriteLine("After HtmlEncode: " + a);
        Console.WriteLine("After HtmlDecode: " + b);
    }
}

输出:

After HtmlEncode:
&lt;html&gt;&lt;head&gt;&lt;title&gt;T&lt;/title&gt;&lt;/head&gt;&lt;/html&gt;

After HtmlDecode:
<html><head><title>T</title></head></html>

【讨论】:

    【解决方案2】:

    您可以为每个替换操作链接Replace() 方法。

    试试这个:

    StringBuilder text = new StringBuilder(lit.Text.ToString());
    msg.Body = text.Replace("value1", "replace1").Replace("value2", 
                          "replace2").Replace("value3", "replace3");
    

    【讨论】:

    • 你不应该链接String.Replace调用,因为每个调用都会遍历原始字符串并创建一个新字符串。
    • 考虑使用StringBuilder 来构建body body。每个字符串 += 连接都会产生一个新字符串
    • @SudhakarTillapudi,现在它甚至无法编译。您应该使用Append 方法。
    • @PauloMorgado:不需要Append(),因为 msg.Body 不是StringBuilder 对象。只是我将变量名从 msg 更改为 text 以消除混淆。
    • 使用StringBuilder 的目的是构建身体——全部。
    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多