Javascript replace () плохо себя ведет на iPhone для длинных строк - PullRequest
0 голосов
/ 06 декабря 2018

Я не могу объяснить это правильно, но String.prototype.replace() действует по-разному на iPhone против ПК, если значение атрибута слишком длинное (как Chrome, так и Safari).

У меня есть простая функция, которая заменяет любую инкапсуляцию {} соответствующей подстрокой, которая должна быть ключом передаваемого объекта:

const data = { lang: "en", version: "1.0", user: "marc" };
const rep = (html, data) =>
    html.replace(/\{*([\w_\-]+)*\}/g, (match, capture) => data[capture] || "");

const html = '<input type="hidden" name="abcdefghijklmnopqr" value="{lang}">'

Приведенный выше код работает только на iPhoneесли атрибут имени короткий.Возвращение:

<input type="hidden" name="abc" value="en"> <input type="hidden" name="abcdefghijklmnopqr" value="{lang}">

Вы можете оформить демонстрацию с помощью своего iPhone здесь: https://codepen.io/raduchiriac/pen/wQVvRv?editors=0010

РЕДАКТИРОВАТЬ: После получения ответа ниже я исправил его с помощью {([\w_\-]+)}

1 Ответ

0 голосов
/ 06 декабря 2018
\{*([\w_\-]+)*\}
  ^
  |

Эта звездочка в вашем паттерне вызывает катастрофический откат .Скорее всего, двигатель просто прекращает сопоставление, чтобы избежать сбоя после некоторого количества шагов.( regex101 сдался после 75 000).

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