电子邮件标题中的'&'不能正确显示,如何在JavaScript中修复?

时间:2019-09-27 10:20:37

标签: javascript unit-testing html-email

我有一些代码以下列格式显示文章标题,简短描述和作者姓名的列表:

标题(作者姓名)
说明

作者的姓名和描述与此处无关,因为它们始终正确显示。大多数标题也可以正确显示,下面是一些示例:

您需要了解的关于银行业务的最重要的一件事(作者的名字)-正确显示

电力和公用事业如何使我成为更好的销售员(作者的名字)-正确显示

PG&E和查克·诺里斯效应(作者的名字)-以下列方式显示不正确: &E和查克·诺里斯效应(作者名字)

仅显示此单个示例存在问题。这就是为什么我专注于'&'符号的原因。但是,在其他标题中,“&”似乎不是问题,其中“&”之前和之后都有空格。

我解决此问题的代码是这样的,但它不会以任何方式影响输出...

// this is not my code
offerRep += '<a _urltype="11" href="' + q.docUrl + '" alt="' + q.documentTitle +'" >' + q.documentTitle + ' "' + fullSubTitle + '"' + ' (' + analystName[0] + ')</a>';

// this is my code 
if (q.documentTitle.indexOf('&') > -1) {
          q.documentTitle.replace(/'&'/g, '&amp;');
        } else {
          return q.documentTitle;
        }

1 个答案:

答案 0 :(得分:0)

第一个问题-可能是因为您只发布了部分代码(*)-此行:

q.documentTitle.replace(/'&'/g, '&amp;');

从不做任何事情,因为replace返回一个新字符串,您不会以任何方式返回或使用它。

然后,正则表达式/'&'/表示您要查找的是撇号,后跟与号,后跟撇号。您只需要/&/

if中使用indexOf并不是真正有用。如果replace找不到正则表达式,它将什么也不做,因此删除if

通常,盲目地用未知的外部内容构建HTML是一个非常糟糕的主意,不仅&需要转义。看看:Can I escape html special chars in javascript?

使用常规功能,并转义要插入HTML的 ALL 外部数据:

function escapeHtml(unsafe) {
  return unsafe
     .replace(/&/g, "&amp;")
     .replace(/</g, "&lt;")
     .replace(/>/g, "&gt;")
     .replace(/"/g, "&quot;")
     .replace(/'/g, "&#039;");
 }


offerRep += '<a _urltype="11" href="' + escapeHtml(q.docUrl) + 
            '" alt="' + escapeHtml(q.documentTitle) +'" >' + 
            escapeHtml(q.documentTitle) + ' "' + escapeHtml(fullSubTitle) + '"' + 
            ' (' + escapeHtml(analystName[0]) + ')</a>';

评论中Salman A的建议也是一种好方法,因为您无需“记住”如何逃脱和逃脱什么。

一种更安全,更好和更现代的方法是使用模板引擎。例如Handlebars.js(但还有很多):

var linkTemplate = Handlebars.compile('<a _urltype="11" href="{{url}}" alt="{{title}}">{{title}} "{{subtitle}}" ({{analystname}})</a>');

var linkHtml = linkTemplate({
                 url: q.docUrl,
                 title: q.documentTitle,
                 subtitle: fullSubTitle,
                 analystname: analystName[0]
               });

offerRep += linkHtml;

(*)在用代码提问时,请始终在有用的上下文中发布代码,绝不要只有几行代码不能自己发挥作用。