第一个问题 - 这可能是因为您只发布了部分代码(*) - 这一行:
q.documentTitle.replace(/'&'/g, '&');
从不做任何事情,因为replace
返回一个新字符串,您不会以任何方式返回或使用该字符串。
然后是正则表达式/'&'/
意味着您正在寻找一个撇号,后跟一个&符号,然后是一个撇号。您只需/&/
.
Using if
with indexOf
在这里并不是很有用。如果replace
找不到正则表达式,它什么也不做,所以删除if
.
一般来说,盲目地使用未知的外部内容构建 HTML 是一个非常糟糕的主意,这不仅是&
需要逃避。看一下:我可以在javascript中转义html特殊字符吗? https://stackoverflow.com/questions/6234773/can-i-escape-html-special-chars-in-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>';
Salman A 在评论中的建议也是一个好方法,因为你不需要“记住”如何逃避以及逃避什么。
更安全、更好、更现代的方法是使用模板引擎。例如Handlebars.js http://handlebarsjs.com/(但还有很多很多):
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;
(*) 当使用代码提出问题时,请始终发布带有有用上下文的代码,而不要只发布几行本身不起作用的代码。