Javascript 为什么我的正则表达式只在某些浏览器中工作?

Javascript 为什么我的正则表达式只在某些浏览器中工作?,javascript,regex,google-chrome,office-addins,outlook-web-addins,Javascript,Regex,Google Chrome,Office Addins,Outlook Web Addins,正在处理outlook的外接程序,该外接程序使用正则表达式将“{First Name | Default=Friend}”和“{Last Name}”字符串替换为联系人的实际姓名和姓氏。当通过Google Chrome在Outlook online中进行测试时,正则表达式可以正常工作,但在Outlook for Mac中则不行,后者显然使用Netscape版本5(或者至少是navigator.userAgent下的浏览器) String.prototype.replaceAll=函数(str1、

正在处理outlook的外接程序,该外接程序使用正则表达式将“{First Name | Default=Friend}”和“{Last Name}”字符串替换为联系人的实际姓名和姓氏。当通过Google Chrome在Outlook online中进行测试时,正则表达式可以正常工作,但在Outlook for Mac中则不行,后者显然使用Netscape版本5(或者至少是navigator.userAgent下的浏览器)

String.prototype.replaceAll=函数(str1、str2、忽略){
返回此.replace(new RegExp(str1.replace(/([\/\,\!\\^$\\\\\\\\\[\]\(\)\.*\+\?\\\\\-\&])/g,“\\$&”),(忽略?“gi”:“g”),(typeof(str2)=“string”)?str2.replace(/\$/g,“$$”:str2);
} 
函数replaceNames(){
var content=“{First Name | Default=Friend}{Last Name}”
var firstName=“Ted”;
var lastName=“Doe”;
让currentContent=content.replaceAll(“{First Name | Default=Friend}”,firstName);
currentContent=currentContent.replaceAll(“{Last Name}”,lastName);
console.log(currentContent);
}
替换名称();
Chrome73将内容返回为:Ted Doe

Netscape 5(在Outlook for Mac中)返回的内容为:Ted{Last Name}

可能出什么问题了?

你怎么了

函数replaceNames(){
var content=“{First Name | Default=Friend}{Last Name}”
var firstName=“Ted”;
var lastName=“Doe”;
让currentContent=content.replace(/{First Name\| Default=Friend}/g,firstName);
currentContent=currentContent.replace(/{lastName}/g,lastName);
console.log(currentContent);
}
替换名称()怎么了

函数replaceNames(){
var content=“{First Name | Default=Friend}{Last Name}”
var firstName=“Ted”;
var lastName=“Doe”;
让currentContent=content.replace(/{First Name\| Default=Friend}/g,firstName);
currentContent=currentContent.replace(/{lastName}/g,lastName);
console.log(currentContent);
}

替换名称()众所周知,Outlook在呈现HTML、遵守CSS和可能处理Javascript方面的能力非常有限。这仍然适用于Office 365最新版本附带的最新版本的Outlook for Windows。因此,不要指望任何关于Outlook为何不能按预期运行的信息,因为它是一个商业化的、封闭源代码的产品,几乎不关注标准遵从性。我敢打赌,它的工作,以看起来舒适,最多的设计

将Outlook for Mac/Windows与Outlook Online进行比较会加深这种不幸的印象,因为Outlook Online不依赖于古老的web引擎,而是依赖于您使用的浏览器。所以,在你的例子中,Chrome是目前使用的网络引擎的另一个极端,Chrome处于最高端,Outlook肯定接近底部

关于您的RegExp,您应该首先尝试减少其代码,以消除不必要的转义。为此,请尝试一些像样的IDE或在线正则表达式工具

/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g
/([\/\,\!\\^\$\{\\[\]\(\)\.\*\+\?\\\\\\\-\&])/g
可能成为

/[/,!\\^${}[\]().*+?|<>&-]/g
/[/,!\^${}[\]().+?|&-]/g
尽管已知在正则表达式上功能有限的旧浏览器可能无法正确解析它。尽管如此,一些转义字符根本不需要转义。然后在最旧的Internet Explorer中尝试相同的RegExp。如果它在那里工作,那么它也可能在Outlook中工作。如果最新的InternetExplorer是11.0,但它不是现代的,但仍然与Outlook中使用的非常不同,这一点就不适用了

此外,我不会依赖于扩展本机对象的原型——关于
String.prototype.replaceAll=function…
——在类似Outlook的上下文中,旧浏览器的Outlook已知也存在该功能的问题,并且由于邮件客户端中与安全相关的考虑,它可能会受到其他限制运行自定义脚本代码

接下来,我认为自己是一个相当熟练的JavaScript开发人员,但我正在努力获取代码的意图。因此,IMHO应该考虑使用不同的方法,而不需要复杂的动态ReGEXP。我想这有助于人们理解更清晰的代码,并且在18个月后你将能够解释清楚。在我看来,你的方法相当粗糙,这与对坏浏览器的支持是不好的结合。我相信,不使用正则表达式,只使用简单的老式Javascript就可以实现您的目的。使用非常基本的非动态正则表达式也许可以,但是尝试依赖

“”.indexOf()
“”.substring()
,您将获得在Netscape Navigator 5.0中运行的代码

关于发现的浏览器版本,请尝试更详细地分析
navigator.userAgent
,并将其与现有的用户代理数据库进行比较,以获得有关Outlook中使用的浏览器引擎的更复杂的结果。提到Netscape Navigator本身并不意味着什么。我的Edge浏览器声称同时与Mozilla/5.0、AppleWebKit和Chrome/64.0有关


总之,可能值得注意的是,与此问题的标题相反,您的代码往往在大多数(积极使用的)浏览器中工作,但在某些仅是浏览器但包含一些模糊已知的web引擎的软件中失败。

众所周知,Outlook在呈现HTML方面的功能非常有限,遵守CSS,并可能处理Javascript。这仍然适用于Office 365最新版本附带的最新版本的Outlook for Windows。因此,不要指望任何关于Outlook为何不能按预期运行的信息,因为它是一个商业化的、封闭源代码的产品,几乎不关注标准遵从性。我敢打赌,它的工作,以看起来舒适,最多的设计

将Outlook for Mac/Windows与Outlook Online进行比较会加深这种不幸的印象,因为Outlook Online不依赖于ANCE
/[/,!\\^${}[\]().*+?|<>&-]/g