Aleksandr-JS-Developer
@Aleksandr-JS-Developer
Бери и делай

Регулярное выражение для нахождения всех ссылок в разметке html?

Долго искал регулярное выражение или любой другой способ найти все ссылки на странице.
Страница - это в буквальном смысле всё содержимое docunemt.querySelector('html').innerHTML. И все эти ссылки мне надо упаковать в массив в виде строк. Проблем с упаковкой не возникло, а вот с регулярным выражением возникло.

Похоже, что все в интернете согласились, что под "найти все ссылки на странице" подразумевается "найти все тэги <a href="...">...</a> в html разметке", что довольно сильно усложнило поиски.

Всё-таки нашёл парочку неплохих, но одно не работает с параметрами, другое - с нетипичными символами, третье - не находит ссылки вида: //google.com, если сделать поддержку //google.com, то строки в скриптах вида //document.querySelector() попадают в список.

Пробовал написать регулярку сам, пробовал создавать несколько и проверять по-одному, но это не вышло.
Мой уровень знания регулярок позволил составить что-то типа этого: (http?s:\/\/|\.\/|\/\/).{0,}), но это очень далеко от идеала.

найденные в интернете

/((http?s|ftp):\/\/|\.\/)[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]/gi
(((http?s:)|)\/\/\w+\.\w{2,3})(\.\w{2})?(\/\S*)?/gi

Даже нашёл вот этого монстра

/((?:(http|https|Http|Https|rtsp|Rtsp):\/\/(?:(?:[a-zA-Z0-9\$\-\_\.\+\!\*\'\(\)\,\;\?\&\=]|(?:\%[a-fA-F0-9]{2})){1,64}(?:\:(?:[a-zA-Z0-9\$\-\_\.\+\!\*\'\(\)\,\;\?\&\=]|(?:\%[a-fA-F0-9]{2})){1,25})?\@)?)?((?:(?:[a-zA-Z0-9][a-zA-Z0-9\-]{0,64}\.)+(?:(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])|(?:biz|b[abdefghijmnorstvwyz])|(?:cat|com|coop|c[acdfghiklmnoruvxyz])|d[ejkmoz]|(?:edu|e[cegrstu])|f[ijkmor]|(?:gov|g[abdefghilmnpqrstuwy])|h[kmnrtu]|(?:info|int|i[delmnoqrst])|(?:jobs|j[emop])|k[eghimnrwyz]|l[abcikrstuvy]|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])|(?:name|net|n[acefgilopruz])|(?:org|om)|(?:pro|p[aefghklmnrstwy])|qa|r[eouw]|s[abcdeghijklmnortuvyz]|(?:tel|travel|t[cdfghjklmnoprtvwz])|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw]))|(?:(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[0-9])))(?:\:\d{1,5})?)(\/(?:(?:[a-zA-Z0-9\;\/\?\:\@\&\=\#\~\-\.\+\!\*\'\(\)\,\_])|(?:\%[a-fA-F0-9]{2}))*)?(?:\b|$)/gi




Может есть готовые решения или другой, более понятный/простой/просто рабочий способ??
Заранее спасибо, в поисках уже пару дней и сейчас в совокупности не вышло корректно обработать даже тестовую страничку
testPage.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<meta 
		name="viewport"
		content="width=device-width, initial-scale=1.0"
	>
	<title>test 1</title>
</head>
<body>
	<h3>test 1</h3>
	<a href="https://google.com">google.com</a>
	<a href="//google.com"></a>
	<a href="//google.com/in/someelse/food.html">in/someelse/food</a>
	<a href="./testPage2.html">test 2</a>
	<a href="./weakPage.html?q=test">weak</a>
</body>
<script>
	//document.querySelectorAll( 'a' ).forEach( l => l.onclick = function () { return false; } );
	document.querySelector( 'h3' ).addEventListener( 'click', () => location.href = 'https://google.com' );
</script>
</html>

  • Вопрос задан
  • 210 просмотров
Пригласить эксперта
Ответы на вопрос 2
Simkav
@Simkav
Ну так если вам нужно достать все ссылки то почему бы не сделать так?
for (link of document.getElementsByTagName('a')){
console.log(link.href)}
Ответ написан
VlasenkoFedor
@VlasenkoFedor
Программист: php, js, go
console.log(document.links) // здесь все ссылки лежат

https://developer.mozilla.org/ru/docs/Web/API/Docu...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы