正在开发Outlook外接程序,该外接程序使用正则表达式将“ {First Name | Default = Friend}”和“ {Last Name}”字符串替换为实际的联系人姓氏和名字。通过Google Chrome在Outlook Online中进行在线测试时,该正则表达式可以正常运行,但在Mac for Outlook(显然使用Netscape版本5(或至少是navigator.userAgent下的浏览器))中进行测试时,正则表达式可以正常工作。
String.prototype.replaceAll = function (str1, str2, ignore) {
return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g, "\\$&"), (ignore ? "gi" : "g")), (typeof (str2) == "string") ? str2.replace(/\$/g, "$$$$") : str2);
}
function replaceNames(){
var content = "{First Name|Default=Friend} {Last Name}"
var firstName = "Ted";
var lastName = "Doe";
let currentContent = content.replaceAll('{First Name|Default=Friend}', firstName);
currentContent = currentContent.replaceAll('{Last Name}', lastName);
console.log(currentContent);
}
replaceNames();
Chrome 73返回的内容为:Ted Doe
Netscape 5(在Outlook for Mac中)返回的内容为:Ted {姓}
出什么问题了?
答案 0 :(得分:2)
怎么了
<div>
<form class="hidden">
form
</form>
</div>
答案 1 :(得分:0)
众所周知,Outlook在呈现HTML,遵守CSS以及可能处理Javascript方面的功能非常有限。这仍然适用于最新版本的Office 365附带的Windows版Outlook的最新版本。因此,不要期望为什么上的任何信息都无法正常运行,因为它是商业的,封闭源代码仅关注标准合规性的产品。我敢打赌,外观设计至多看起来很舒适。
将Mac / Windows版的Outlook与Outlook Online进行比较,会增加这种不幸的印象,因为Outlook Online并不依赖于古老的Web引擎,而是依赖于您使用的浏览器。因此,在您的情况下,Chrome就是当前使用的各种网络引擎的另一端,而Chrome处于最高端,而Outlook绝对接近最低端。
关于RegExp,您应该首先尝试减少其代码,以消除不必要的转义。为此,请尝试使用一些不错的IDE或在线正则表达式工具。
/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g
可能成为
/[/,!\\^${}[\]().*+?|<>&-]/g
尽管已知在正则表达式上功能有限的较旧的浏览器可能无法正确解析该表达式。但是,几个转义字符根本不需要转义。然后,在您能获得的最早的Internet Explorer中尝试使用相同的RegExp。如果在那工作,它也可能在Outlook中工作。如果最新的Internet Explorer的版本为11.0(现代版本除外),则此设置将不适用。但与Outlook所使用的版本仍存在很大差异。
此外,在String.prototype.replaceAll = function ...
方面,我不会依赖扩展本机对象的原型-在诸如旧浏览器的Outlook之类的已知情况下,该功能也存在问题,并且可能会受到其他限制由于运行自定义脚本代码的邮件客户端中与安全性有关的考虑因素而导致限制。
接下来,我认为自己是位熟练的Javascript开发人员,但我正努力理解代码的意图。因此,恕我直言,您应该考虑使用不需要复杂的动态RegExp的其他方法。我想这将有助于使人们能够理解更清晰的代码,并且从现在开始的18个月内您将能够进行解释。您的方法对我来说似乎有点骇人听闻,这与对损坏的浏览器的支持不好结合。我敢肯定,仅使用简单的老式Javascript就可以在没有正则表达式的情况下实现您的目的。使用非常基本的,非动态的正则表达式可能没问题,但是尝试依靠"".indexOf()
和"".substring()
,您还将获得在Netscape Navigator 5.0中也能正常工作的代码。
关于发现的浏览器版本,请尝试更详细地分析navigator.userAgent
并将其与现有的用户代理数据库进行比较,以获得有关Outlook中使用的浏览器引擎的更复杂的结果。提及Netscape Navigator本身并没有多大意义。我的Edge浏览器声称同时与Mozilla / 5.0,AppleWebKit和Chrome / 64.0有关。
最后,值得一提的是,与该问题的标题相反,您的代码倾向于在大多数(正在使用的)浏览器中运行,但在一些勉强是浏览器但包含一些众所周知的Web引擎的软件中却无法使用。