Javascript Regex返回以特定值开头的网页的所有属性

Javascript Regex返回以特定值开头的网页的所有属性,javascript,html,regex,userscripts,Javascript,Html,Regex,Userscripts,问题很简单,我需要得到所有属性的值,这些属性的值以http://example.com/api/v3?。例如,如果页面包含 <iframe src="http://example.com/api/v3?download=example%2Forg"> <meta twitter="http://example.com/api/v3?return_to=%2F"> 然后我应该得到一个包含2个成员的数组/列表:http://example.com/api/v3?retu

问题很简单,我需要得到所有属性的值,这些属性的值以
http://example.com/api/v3?
。例如,如果页面包含

<iframe src="http://example.com/api/v3?download=example%2Forg">
<meta twitter="http://example.com/api/v3?return_to=%2F">

然后我应该得到一个包含2个成员的数组/列表:
http://example.com/api/v3?return_to=%2F
http://example.com/api/v3?download=example%2Forg
(顺序无关紧要)

我不需要元素,只需要属性的值。

基本上我需要返回以
http://example.com/api/v3?
并以空格结尾。

有CSS选择器
*
表示“任何元素”

没有CSS选择器表示“具有此值的任何属性”。属性名称是任意的。虽然HTML规范中定义了几个属性,但在您的示例中可以使用自定义属性,如
twitter
属性。这意味着您必须迭代给定元素上的所有属性


如果没有全局属性值选择器,则需要手动迭代所有元素和值。在使用暴力之前,您可能需要确定一些启发式方法来缩小搜索范围。

正则表达式可能如下所示:

/http:\/\/example\.com\/api\/v3\?\S+/g
确保用反斜杠转义每个
/
<代码>\S+生成所有后续非空格字符。如果还要排除引号,也可以尝试使用
[^\s”]+
而不是
\s

但根据我的经验,正则表达式通常比直接处理已解析的对象慢,因此我建议您尝试使用以下
Array
和DOM函数:

获取所有元素,将它们映射到它们的属性,并过滤那些以
http://example.com/api/v3?
,将所有属性列表缩减为一个数组,并将这些属性映射到它们的值

Array.from(document.querySelectorAll("*"))
  .map(elem => Object.values(elem.attributes)
  .filter(attr => attr.value.startsWith("http://example.com/api/v3?")))
  .reduce((list, attrList) => list.concat(attrList), [])
  .map(attr => attr.value);

您可以找到ES6和ES5函数的polyfills,并可以使用Babel或相关工具将代码转换为ES5(或手动替换arrow函数).

我找不到一种方法来使用
queryselectorAll
来实现这一点。简单,循环遍历每个元素和每个属性。@KevinB:这是个糟糕的主意。如果我的网页有500k个元素(我无法阻止加载的大量广告),该怎么办 ? 在Android上,您可以使用UserScript或ads阻止,但不能同时使用两者。然后您必须循环使用500k个元素。您没有提供任何有用的筛选依据。@Biten请告诉我哪个属性选择器接受通配符作为属性名。如果没有全局属性值选择器,
中没有任何内容,您需要手动对所有元素和值进行迭代。
是否真的没有可以使用
的rexegp。匹配
以返回所需的数组 ?@user2284570是的,您可能可以这样做,因为您只需要值…将整个页面作为html字符串…假设您不尝试修改anything@user2284570如果您想对整个文档HTML应用正则表达式,可能有一个,但我怀疑它是否会更有效(当然也不太清楚)而不是使用其他方法查找您要查找的属性。@Ourobrus:not
document.querySelectorAll()
在整个页面上执行regexp匹配 ?@user2284570是什么让您认为手动迭代500k元素会很慢,但使用regex解析相同500k元素的序列化会很快?
是否真的没有可以使用
的rexegp。match`能够直接返回我需要的数组 ?. 也就是说,返回以
http://example.com/api/v3?
并以空格结尾。@user2284570我不建议使用正则表达式,但我已将它们包含在答案中。您还应考虑到。