Javascript 先找到<;a>;href与regex匹配的标记
我正在构建一个chrome扩展,这个扩展所做的一件事就是在当前页面中查找第一个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"
标记,该标记的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;
}
}