首页 > 解决方案 > Javascript replace() 在 iPhone 上对长字符串行为不端

问题描述

我似乎无法以正确的方式解释这一点,但String.prototype.replace()如果属性的值太长(Chrome 和 Safari),则在 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_\-]+)}

标签: javascriptiphoneregexstringreplace

解决方案


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

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


推荐阅读