我可以在 querySelectorAll 中使用正则表达式吗?

IT技术 javascript regex hyperlink selectors-api
2021-02-27 22:50:15

在我正在做的页面上,我最终会得到这样的自定义link元素:

<link rel="multiply" type="service/math" src="path/to/service">
<link rel="substract" type="service/math" src="path/to/service">
...

我正在尝试使用指定querySelectorAll类型检索所有链接元素,但service/...一无所获。

目前我正在选择这个:

root.querySelectorAll('link');

<link>当我只想要带有类型的元素时,它为我提供了所有元素service/.*

问题:
我可以向 QSA 选择器添加正则表达式吗?如果是这样,该怎么做?

2个回答

您不能真正在选择器中使用正则表达式,但 CSS 选择器的功能强大到足以满足您的需要,其“开始于”语法受正则表达式启发。

您可以使用匹配属性选择器的子字符串: link[type^=service]

读取“link具有type以“服务”开头的属性的类型节点

正式规范

[att^=val]

表示具有 att 属性的元素,其值以前缀“val”开头。如果“val”是空字符串,则选择器不代表任何内容。

工作 JSFiddle

@frequent 不客气!对于它的value,.filter通过元素检查它们的类型属性调用也是一个完全有效的解决方案恕我直言。
2021-05-03 22:50:15
这对于尝试使用 Angular JS 1.5+ 中的 Controller-As 语法访问控制器实例很有用。这正是我在使用 controller-as 语法更新我的 angular 应用程序时需要的答案,并希望对它们的范围进行控制台级别的访问:angular.element( document.querySelectorAll( '[ng-controller^="' + <controller name> + '"' )[0] ).scope
2021-05-18 22:50:15

我知道这已经有 7 年历史了,但这就是您的做法(对于属性值):

function DOMRegex(regex) {
    let output = [];
    for (let i of document.querySelectorAll('*')) {
        if (regex.test(i.type)) { // or whatever attribute you want to search
            output.push(i);
        }
    }
    return output;
}
console.log(DOMRegex(/^service\//)); // your regex here
<link rel="multiply" type="service/math" src="path/to/service">
<link rel="substract" type="service/math" src="path/to/service">
<link rel="test" type="notservice/math" src="path/to/notservice">
<div id="some-other-node"></div>

要搜索所有元素属性,您可以使用:

function DOMRegex(regex) {
    let output = [];
    for (let i of document.querySelectorAll('*')) {
        for (let j of i.attributes) {
            if (regex.test(j.value)) {
                output.push({
                    'element': i,
                    'attribute name': j.name,
                    'attribute value': j.value
                });
            }
        }
    }
    return output;
}
console.log(DOMRegex(/(?<!t)service/)); // your regex here
<link rel="multiply" type="service/math" src="path/to/service">
<link rel="substract" type="service/math" src="path/to/service">
<link rel="test" type="notservice/math" src="path/to/notservice">
<div id="some-other-node"></div>

我把它放在一个很好的对象布局中。

我非常喜欢这个,以至于我将两个函数组合成一个参数化函数——你可以在这里找到该代码的“要点”
2021-04-21 22:50:15