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`!()\[\]{};:'".,<>?«»“”‘’"e]))/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, начиная с
NOTE thegetAttribute, поэтому браузер не пытается интерпретировать 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`!()\[\]{};:'".,<>?«»“”‘’"e]))/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"))
);