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

问题描述 投票:0回答:1

我似乎无法以正确的方式解释这一点,但如果属性的值太长(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_\-]+)}修复它

javascript iphone regex string replace
1个回答
1
投票
\{*([\w_\-]+)*\}
  ^
  |

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

© www.soinside.com 2019 - 2024. All rights reserved.