Заголовки сообщений электронной почты не отображаются правильно, когда в заголовке «&», как это исправить в JavaScript? - PullRequest
1 голос
/ 27 сентября 2019

У меня есть код, который отображает список названий статей, их краткие описания и имена авторов в следующем формате:

Заголовок (имя автора)
описание

Имена и описания автора здесь не актуальны, потому что они всегда отображаются правильно.Большинство названий также отображаются правильно, вот несколько вымышленных примеров:

Самая важная вещь, которую вы должны знать о банковском деле (имя автора) - отображается правильно

Как Power & UtilitiesСделал меня лучшим продавцом (имя автора) - отображается правильно

PG & E And The Chuck Norris Effect (имя автора) - отображается неправильно следующим образом: & E And The Chuck Norris Effect (имя автора)

Существует проблема только с отображением этого единственного примера.Вот почему я сосредоточился на символе «&».Но «&», похоже, не является проблемой в других заголовках, где «&» имеет пробел до и после него.

Мой код для исправления этой проблемы подобен этому, но он не влияет на выводлюбым способом ...

// 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 голосов
/ 27 сентября 2019

Первая проблема - возможно, потому что вы разместили только часть кода (*) - эта строка:

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

никогда ничего не делает, потому что replace возвращает новую строкукоторый вы не возвращаете или не используете.

Тогда регулярное выражение /'&'/ означает, что вы ищете апостроф, за которым следует амперсанд, за которым следует апостроф.Вам просто нужно /&/.

Использование if с indexOf здесь не очень полезно.Если replace не найдет регулярное выражение, оно просто ничего не будет делать, поэтому отбросьте if.

Как правило, это очень плохая идея - просто слепо создавать HTML с неизвестным внешним контентом, подобным этому, и это не только&, который нужно убежать.Взгляните на: Могу ли я избежать специальных символов html в javascript?

Использовать общую функцию и экранировать ALL внешние данные, которые вы хотите вставить в HTML:

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>';

Предложение Салмана А в комментариях также является хорошим способом, потому что вам не нужно «запоминать», как и что избегать.

Более безопасный, лучший и более современный способбудет использовать шаблонизатор.Например, 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;

(*) При задании вопросов с кодом ВСЕГДА публикуйте код в полезном контексте, а не в нескольких строках.которые не работают сами по себе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...