Почему мое выражение regex работает только в некоторых браузерах? - PullRequest
0 голосов
/ 23 июня 2019

Работа над надстройкой для outlook, которая использует регулярное выражение для замены строк «{Имя | По умолчанию = Друг}» и «{Фамилия}» на фактические имя и фамилию контакта. Регулярное выражение прекрасно работает при тестировании в Outlook через Интернет с помощью Google Chrome, но не в Outlook для Mac, который, по-видимому, использует 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 возвращает содержимое в виде: Тед Доу

Netscape 5 (из Outlook для Mac) возвращает содержимое в виде: Тед {Фамилия}

Что может быть не так?

Ответы [ 2 ]

2 голосов
/ 23 июня 2019

Что не так с

function replaceNames() {
  var content = "{First Name|Default=Friend} {Last Name}"
  var firstName = "Ted";
  var lastName = "Doe";
  let currentContent = content.replace(/{First Name\|Default=Friend}/g, firstName);
  currentContent = currentContent.replace(/{Last Name}/g, lastName);
  console.log(currentContent);
}

replaceNames();
0 голосов
/ 24 июня 2019

Известно, что Outlook имеет очень ограниченные возможности для рендеринга HTML, подчинения CSS и, возможно, обработки Javascript.Это по-прежнему относится к последним версиям Outlook для Windows, которые поставляются с последними выпусками Office 365. Таким образом, не ожидайте никакой информации о , почему Outlook не работает должным образом, поскольку это коммерческий продукт с закрытым исходным кодом.это едва фокусируется на соответствии стандарту.Бьюсь об заклад, он работает, чтобы выглядеть максимально комфортно по дизайну.

Сравнение Outlook для Mac / Windows с Outlook Online усиливает это злополучное впечатление, поскольку Outlook Online полагается не на древний веб-движок, а на браузерты используешь.Итак, Chrome именно в вашем случае является противоположным концом спектра используемых в настоящее время веб-движков, причем Chrome находится на самом верхнем конце Outlook, безусловно, близко к низу.

Что касается вашего RegExp, вам следует попробовать уменьшить егоКод сначала устраняет ненужные побеги.Для этого попробуйте какой-нибудь приличный IDE или онлайн-инструмент регулярных выражений.

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

может стать

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

, хотя более старые браузеры, которые имеют ограниченные возможности для регулярных выражений, могут не анализировать это должным образом.Тем не менее, нескольким сбежавшим персонажам вообще не нужно убегать.Затем попробуйте тот же RegExp в самой старой версии Internet Explorer, которую вы можете получить.Если он работает там, может быть также работает в Outlook.Это не относится к последним версиям Internet Explorer 11.0, но он по-прежнему сильно отличается от того, что используется в Outlook.

Кроме того, я бы не стал полагаться на расширение прототипов собственных объектов -в отношении String.prototype.replaceAll = function ... - в контексте, подобном 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 одновременно.

В заключение, возможно, стоит отметить, что в отличие от названия этого вопроса ваш код имеет тенденцию работать вбольшинство (активно используемых) браузеров, но не работает в некоторых программах, которые едва ли являются браузерами, но содержат какой-то смутно известный веб-движок.

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