Javascript replace()在iPhone上行为不端用于长字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript replace()在iPhone上行为不端用于长字符串相关的知识,希望对你有一定的参考价值。

我似乎无法以正确的方式解释这一点,但如果属性的值太长(Chrome和Safari),String.prototype.replace()在iPhone与PC上的行为不同。

我有一个简单的函数,用匹配的子字符串替换任何{}封装,子字符串应该是传递对象的键:

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}">'

上面的代码仅在name属性较短时才适用于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_-]+)}修复它

答案
{*([w_-]+)*}
  ^
  |

你的模式中的这个星号会导致catastrophic backtracking。最有可能的是,引擎只是停止匹配以避免在经过一些步骤后发生崩溃。 (regex101在75,000之后放弃了)。

以上是关于Javascript replace()在iPhone上行为不端用于长字符串的主要内容,如果未能解决你的问题,请参考以下文章

.replace()无法在嵌入式JavaScript中运行

JavaScript replace() 方法转换时间数据中的“-”和“/”

.replace 不是 javascript 中的函数错误 [重复]

javascript:.replace 中的异步/等待

Python string.replace 等效项(来自 Javascript)

在Vue.js中使用JavaScript replace()导致错误。