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

fre*_*ent 39 javascript regex hyperlink selectors-api

在我正在做的页面上,我将以这样的自定义link元素结束:

<link rel="multiply" type="service/math" src="path/to/service">
<link rel="substract" type="service/math" src="path/to/service">
...
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用指定querySelectorAll类型检索所有链接元素service/...并且无处可去.

目前我选择这个:

root.querySelectorAll('link');
Run Code Online (Sandbox Code Playgroud)

<link>当我只想要有类型的那些时,它给了我所有的元素service/.*

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

Ben*_*aum 69

你不能在选择器中真正使用正则表达式,但CSS选择器足够强大,可以满足您的需要,其灵感来自正则表达式.

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

读取" link具有type以"service"开头的属性的类型的节点

正式规范:

[ATT ^ = VAL]

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

工作JSFiddle


SUM*_*UM1 11

我知道这已经 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
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

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

  • 我非常喜欢这个,所以我将这两个函数组合成一个参数化函数 - [您可以在这里找到该代码的“要点”](https://gist.github.com/oze4/990e0846b0b535785b3f34c5df89be5e) (2认同)

Ahm*_*rMH 5

该帖子很旧,但可能对某人有帮助。如果like需要子句并且我们不想仅按开头进行搜索,则可以使用以下语法:

document.querySelectorAll('[type*=service]');
Run Code Online (Sandbox Code Playgroud)