使用getElementsByTagName查找变量中的所有href

时间:2019-02-25 07:21:05

标签: javascript getelementsbytagname

在一个变量中,我持有从DB获得的HTML源代码。我想在此内容中搜索所有“ a href”属性,并将它们在表格中列出。

现在我在这里找到了如何在DOM中进行搜索(如下所示),但是如何在变量中进行搜索?

var links = document.getElementsByTagName("a").getElementsByAttribute("href");

目前已通过RegEx进行搜索,但是效果不佳:

matches_temp = result_content.match(/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’&quote]))/ig);

在result_content中,我持有该HTML Source。

2 个答案:

答案 0 :(得分:0)

getElementsByTagName返回一个没有名为getElementsByAttribute的方法的节点列表,但仅在您具有DOM访问权限的情况下

没有DOM (例如node.js)

const hrefRe = /href="(.*?)"/g;
const urlRe = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’&quote]))/ig;

 
const stringFromDB = `<a href="http://000">000</a>
Something something <a href="http://001">001</a> something`

stringFromDB.match(hrefRe).forEach(
 (href) => console.log(href.match(urlRe)[0] ) 
);

// oldschool: 
// stringFromDB.match(hrefRe).forEach(function(href) {  console.log(href.match(urlRe)[0] )      });

在此代码中,我首先创建一个DOM代码段 而且我只获得以href开头的锚点

注意 getAttribute,以便浏览器不会尝试解释URL

如果您只想匹配href的特定类型,请使用正则表达式:

const re = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’&quote]))/ig;

const stringFromDB = `<a href="http://000">000</a>
<a href="http://001">001</a>`

let doc = document.createElement("div");
doc.innerHTML = stringFromDB

doc.querySelectorAll("a[href]").forEach(
  (x) => console.log(x.getAttribute("href").match(re)[0])
);

没有正则表达式

const stringFromDB = `<a href="http://000">000</a>
<a href="http://001">001</a>`

let doc = document.createElement("div");
doc.innerHTML = stringFromDB

doc.querySelectorAll("a[href]").forEach(
 (x) => console.log(x.getAttribute("href")) 
);

答案 1 :(得分:0)

首先,您不应该使用RegEx来解析HTML。 This answer解释了原因。

其次,您使用的getElementsByAttribute不正确-它完全按照它说的去做,并且通过属性获取元素。您应该只在带有querySelectorAll的所有元素上使用href,然后在map中使用href

var hrefs = document.querySelectorAll("a[href*=http]");
var test = Array.prototype.slice.call(hrefs).map(e => e.href);
console.log(test);
<a href="http://example.com">Example</a>
<a href="http://example1.com">Example 1</a>
<a href="http://example2.com">Example 2</a>
<a href="http://example3.com">Example 3</a>