【发布时间】:2020-12-02 15:35:28
【问题描述】:
想要从页面中挑选出所有的 JSON 块。代码是:
for (el of document.querySelectorAll(['div[class*="json"]', 'script[type="text/javascript"]', 'script[type="application/json"]'])) {
if (el.innerHTML) {
let matches = el.innerHTML.match(/({(?:\s|\n)*["'](?:\s|\n|.)*?["']:(?:\s|\n)*["'[{](?:\s|\n|.)+?})(?:;|$)/g)
console.log(matches)
}
}
通常,页面上有 2-5 个元素。问题是,在这样的查询之后页面停止响应(即使 Chrome 开发工具搜索也不起作用)。
我假设查询可能会导致一些负载(而 CPU 没有显示它),所以问题是:可能是什么问题以及如何优化表达式以降低负载?
附:如果操作需要时间也没关系,所以也许有一种方法可以在开始另一个操作之前等待每个操作完成,以分配负载?
【问题讨论】:
-
您可以在 try/catch 组中使用 JSON.parse。如果 JSON.parse 抛出错误,则不是 json
-
为什么要在 JavaScript 中寻找 JSON? JSON 是 JavaScript 对象/数组语法的子集,但它们并不完全相同。
-
即使你找到了,如果它使用了 JSON 中不允许的 JS 特性,例如字符串周围的单引号,或者不是的对象键,你将无法解析它引用。
-
@Barmar 因为 JSON 并不总是存储在
type="application/json"脚本中,它通常存储为字典,保存到变量中,或者只是在div中。从技术上讲,问题不是JSON,而是关于页面加载以及如何优化它:) -
我在 regex101.com 上试过你的正则表达式。它与有效 JSON 格式的
["foo"]不匹配。看起来它只匹配 JSON 对象,而不是数组。 OTOH,它匹配无效的 JSON,如{"x": {"a": ["foo"], "b":}
标签: javascript json regex