先找<a>其href匹配regex的标记
Find first <a> tag whose href matches regex
我正在构建一个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有关,但没有调查太久
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
相关文章:
- Regex匹配除“”之外的所有字符;.js”;
- 如果匹配项在特定的html标记中,则跳过regex匹配
- Regex:匹配以“AM”结尾的单词(不区分大小写比较)
- 使用jquery查找regex匹配的元素
- Javascript Regex匹配两个字符串之间的子字符串,但子字符串可以包含DOT(.)
- Javascript Regex:匹配时忽略子组
- Javascript RegEx匹配URL's,但不包括图像
- RegEx匹配两种模式之间的所有内容(javascript)
- 用Javascript Regex匹配逗号分隔的重复字符串
- jQuery:如何将RegEx匹配的纯文本包装在锚标记中
- Regex匹配2个重复值之间的所有值
- regex匹配数字逗号数字
- 使用regex匹配url中的前缀
- 通过regex匹配ahref标记,然后转换为字符串
- Regex匹配除以7开头的10位数字以外的任何一组数字
- 如果字符串与javascript中的regex匹配,请从数组中删除它们
- Regex-匹配单词集
- 如何匹配其他一切,但不管它是什么's与regex匹配
- Regex匹配Typescript中的值
- Regex匹配更多可能性(javascript)