Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 先找到<;a>;href与regex匹配的标记_Javascript_Regex_Xpath - Fatal编程技术网

Javascript 先找到<;a>;href与regex匹配的标记

Javascript 先找到<;a>;href与regex匹配的标记,javascript,regex,xpath,Javascript,Regex,Xpath,我正在构建一个chrome扩展,这个扩展所做的一件事就是在当前页面中查找第一个标记,该标记的href属性与给定的正则表达式匹配。仅限JS 我脑子里有几个解决方案,我试过,但是每次,页面都会因为我试过的解决方案而冻结(即,如果我对执行此逻辑的行进行注释,页面将正确加载)。所以我需要一个快速的解决方案 以下是我尝试过的: 解决方案1:Xpath var reg = something; var result = document.evaluate( '//*[local-name()="a"

我正在构建一个chrome扩展,这个扩展所做的一件事就是在当前页面中查找第一个
标记,该标记的
href
属性与给定的正则表达式匹配。仅限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;
}
if (url = document.body.innerHTML.toString().match(reg)[0])
    return url;
页面冻结

解决方案2:Xpath使用matches()

我试图在“”之间硬编码我的_regex,但在chrome控制台中出错(不是有效的Xpath表达式)。即使把一些像
[matches(@href,'rss')]
这样简单的内容放进去,也会出现同样的错误。怀疑与xpath 1.0或2.0有关,但没有调查太久

解决方案3:document.body.innerHTML.match()

页面冻结


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

这里有一个解决方案,可以用来查找字符串、正则表达式或两者:

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;
    }
}
这是小提琴:

我正在使用它,我认为它比获取元素标记和其他东西更异步,尽管这也会起作用


顺便说一句,
innerHTML
很糟糕-尽量避免使用它:p

您真的需要一个完整的正则表达式,还是只需要匹配一个简单的字符串?在后一种情况下,您可以将
document.querySelector
与属性选择器一起使用。没有足够的文本来回答:
Array.prototype.filter.call(document.queryselectoral(“a[href]”),function(el){return el.href.match(reg);})[0]
@Malk:page也冻结:(@Barmar yes,regex是这样的:
/(https?:\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w\.-]*)*(feed | rss)。*(\/|.xml)?/
可能还有其他问题。即使有200000个链接,find调用也不会明显挂起[。也许你在一个循环中运行了这个功能?你应该用小提琴重新创建这个情况。
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;
    }
}