正则表达式 return 以特定值开头的网页的所有属性

Regex to return all attributes of a web page that starts by a specific value

问题很简单,我需要获取所有以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">

然后我应该得到一个 array/list 有 2 个成员:http://example.com/api/v3?return_to=%2Fhttp://example.com/api/v3?download=example%2Forg (顺序无关紧要).

我不需要元素,只需要属性值。
基本上我需要 returns 字符串以 http://example.com/api/v3? 开头并以 space.

结尾的正则表达式

有CSS选择器*意思是"any element"。

没有 CSS 选择器表示 "any attribute with this value"。属性名称是任意的。虽然 HTML 规范中定义了多个属性,但可以在您的示例中使用自定义属性,例如 twitter 属性。这意味着您必须遍历给定元素的所有属性。

如果没有全局属性值选择器,您将需要手动遍历所有元素和值。您可能可以确定一些启发式方法,以帮助在进行蛮力搜索之前缩小搜索范围。

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

/http:\/\/example\.com\/api\/v3\?\S+/g

确保使用反斜杠转义每个 /?\S+ 产生所有后续的非 space 字符。如果您还想排除引号,也可以尝试 [^\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 函数的 polyfill,并可以使用 Babel 或相关工具将代码转换为 ES5(或手动替换箭头函数)。