Первая проблема - возможно, потому что вы разместили только часть кода (*) - эта строка:
q.documentTitle.replace(/'&'/g, '&');
никогда ничего не делает, потому что replace
возвращает новую строкукоторый вы не возвращаете или не используете.
Тогда регулярное выражение /'&'/
означает, что вы ищете апостроф, за которым следует амперсанд, за которым следует апостроф.Вам просто нужно /&/
.
Использование if
с indexOf
здесь не очень полезно.Если replace
не найдет регулярное выражение, оно просто ничего не будет делать, поэтому отбросьте if
.
Как правило, это очень плохая идея - просто слепо создавать HTML с неизвестным внешним контентом, подобным этому, и это не только&
, который нужно убежать.Взгляните на: Могу ли я избежать специальных символов html в javascript?
Использовать общую функцию и экранировать ALL внешние данные, которые вы хотите вставить в HTML:
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
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;
(*) При задании вопросов с кодом ВСЕГДА публикуйте код в полезном контексте, а не в нескольких строках.которые не работают сами по себе.