先找<a>其href匹配regex的标记

Find first <a> tag whose href matches regex

本文关键字:regex 匹配 先找 href      更新时间:2023-09-26

我正在构建一个chrome扩展,这个扩展所做的一件事就是寻找当前页面中href属性匹配给定正则表达式的第一个<a>标记。JS。

我有几个解决方案在脑海中,我尝试了它们,但每次,页面冻结,因为我尝试的解决方案(即,如果我注释行做这个逻辑,页面加载正确)。所以我需要一个快速解决方案。

这是我尝试的:

方案1:Xpath

var reg = something;
var result = document.evaluate(
    '//*[local-name()="a"][contains(@href, "rss") or contains(@href, "feed")]', //first filtering
     document, null, 0, null
);
var item;
while (item = result.iterateNext()) {
    if (item.href.matches(reg)) // second and real filtering
    return item.href;
}

页面冻结。

方案2:Xpath使用matches()

var result = document.evaluate(
    "//*[local-name()='a'][matches(@href, my_regex)]", //first filtering
     document, null, 0, null
);
var item;
while (item = result.iterateNext()) {
    return item.href;
}

我试图在"s"之间硬编码my_regex,但我在chrome控制台得到了一个错误(不是一个有效的Xpath表达式)。甚至把一些简单的[matches(@href, 'rss')]给出同样的错误。怀疑与xpath 1.0或2.0有关,但没有调查太久

方案三:document.body.innerHTML.match()
if (url = document.body.innerHTML.toString().match(reg)[0])
    return url;

页面冻结。

现在我没有太多的想法了,也许可以尝试使用xpath的match(),但基本上就这些了。你们有什么想法吗?

这里有一个解决方案,您可以适应查找字符串,regexp或两者:

var string_match = "";
var regexp_match = new RegExp("www.*", "i");
var filter = {
    acceptNode: function(node){
        if((node.nodeType === 1) && (node.tagName === "A")){
            return NodeFilter.FILTER_ACCEPT;
        }
    }
}
var tree_walker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, filter, false);
while(tree_walker.nextNode()){
    if(tree_walker.currentNode.href === string_match){
        console.log(tree_walker.currentNode);
        break;
    }else if(regexp_match.test(tree_walker.currentNode.href)){
        console.log(tree_walker.currentNode);
        break;
    }
}

这里是小提琴:http://jsfiddle.net/59vFt/2/

我用的是document。TreeWalker,我认为是更异步的获取元素标签和东西,虽然这也将工作。

Btw, innerHTML是可怕的-尽量避免使用它:p