正则表达式 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=%2F
和http://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(或手动替换箭头函数)。
问题很简单,我需要获取所有以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=%2F
和http://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(或手动替换箭头函数)。