Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Составить регулярку (https://javascript.ru/forum/events/78648-sostavit-regulyarku.html)

rusplamen 14.10.2019 14:01

Составить регулярку
 
Добрый день всем!
Помогите составить регулярное выражение.

Есть в html-коде например такие ссылки:
<a href="https://javascript.ru/forum/" rel="noopener nofollow">Форум</a>
<a href="https://javascript.ru/forum/" rel="noopener follow">Форум</a>
<a href="https://javascript.ru/forum/" rel="opener nofollow">Форум</a>
<a href="https://javascript.ru/forum/" rel="nofollow">Форум</a>
<a href="https://javascript.ru/forum/" rel="noopener">Форум</a>
<a rel="noopener nofollow" href="https://javascript.ru/forum/">Форум</a>
<a href='https://javascript.ru/forum/' rel=noopener nofollow>Форум</a>
<a href=https://javascript.ru/forum/ rel='noopener nofollow'>Форум</a>
<a href=https://javascript.ru/forum/ rel="">Форум</a>
<a href=https://javascript.ru/forum/>Форум</a>

Задача следующая:
На вход идёт определенная ссылка, в данном случае https://javascript.ru/forum/
Необходимо определить наличие данной ссылки в коде, где нет вхождения в теге <a> noopener или nofollow.
При этом в атрибутах могут быть как двойные или одинарные кавычки, даже может и не быть кавычек (такое тоже встречал), а также атрибут rel может встречаться и до атрибута href и после него.

На выходе, учитывая список ссылок выше, должны остаться такие ссылки:
<a href=https://javascript.ru/forum/ rel="">Форум</a>
<a href=https://javascript.ru/forum/>Форум</a>

Мне нужна регулярка только. Я пока не очень силён в них. Спасибо!

laimas 14.10.2019 14:33

<a href='https://javascript.ru/forum/' rel=noopener nofollow> - это ошибка, нельзя оставлять вне кавычек строки с пробелом, да и вообще значения атрибутов вне без кавычек, это не гут.

var a = [...document.getElementsByTagName('a')].filter((a)=>{
   return !a.rel     
});

console.log(a)

rusplamen 14.10.2019 14:49

Да, ошибка. Но, встречал такое в коде, что есть без кавычек, но браузер интерпретирует для пользователя с кавычками.
Например, я открываю F12 - атрибут с кавычками, открываю исходный код (Ctrl + U) - тот же атрибут без кавычек. А скрипт, "дергает" именно тот код, который без кавычек.
Мне нужна именно регулярка. Я пишу скрипт в GAS (Google App Script).

laimas 14.10.2019 14:58

Цитата:

Сообщение от rusplamen
Но, встречал такое в коде, что есть без кавычек, но браузер интерпретирует для пользователя с кавычками.

Это ошибка, никаких интерпретаций не будет:

<input value=one two />

Значением будет то, что до первого пробела, остальное будет мусором, тоже самое будет и rel=noopener nofollow.

ksa 14.10.2019 15:02

Цитата:

Сообщение от rusplamen
Помогите составить регулярное выражение.

Оно тут не нужно... :no:
Достаточно использовать селекторы

<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='https://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
$(function(){
	var str='a[href^="https://javascript.ru/forum/"][rel*="noopener"],';
	str+='a[href^="https://javascript.ru/forum/"][rel*="nofollow"]';
	var o=$(str).hide();
});
</script>
</head>
<body>
<a href="https://javascript.ru/forum/" rel="noopener nofollow">Форум 1</a>
<a href="https://javascript.ru/forum/" rel="noopener follow">Форум 2</a>
<a href="https://javascript.ru/forum/" rel="opener nofollow">Форум 3</a>
<a href="https://javascript.ru/forum/" rel="nofollow">Форум 4</a>
<a href="https://javascript.ru/forum/" rel="noopener">Форум 5</a>
<a rel="noopener nofollow" href="https://javascript.ru/forum/">Форум 6</a>
<a href=https://javascript.ru/forum/ rel='noopener nofollow'>Форум 7</a>
<a href=https://javascript.ru/forum/ rel="">Форум 8</a>
<a href=https://javascript.ru/forum/>Форум 9</a>
</body>
</html>

ksa 14.10.2019 15:08

Цитата:

Сообщение от rusplamen
Мне нужна именно регулярка.

Регулярки не отрабатывают сразу условия типа "должно быть это и это, пофиг в какой последовательности"... :no:

rusplamen 14.10.2019 15:10

Я пишу на Google App Script. Здесь jquery не подходит

laimas 14.10.2019 15:14

Цитата:

Сообщение от rusplamen
Мне нужна именно регулярка.

То есть <a..., это текст?

ksa 14.10.2019 15:21

rusplamen, вот вариант с проверкой 2-х регулярок... Но раздельных. :nono:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='https://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
$(function(){
	var re1=/href=["']?https:\/\/javascript\.ru\/forum\//;
	var re2=/rel=["']?[^"']*(noopener|nofollow)/;
	$('div').each(function(){
		var str=this.innerHTML;
		var txt=$(this).text();
		if (re1.test(str) && re2.test(str)) {
			$(this).append(' - no');
		};
	});
});
</script>
</head>
<body>
<div>
<a href="https://javascript.ru/forum/" rel="noopener nofollow">Форум 1</a>
</div>
<div>
<a href="https://javascript.ru/forum/" rel="noopener follow">Форум 2</a>
</div>
<div>
<a href="https://javascript.ru/forum/" rel="opener nofollow">Форум 3</a>
</div>
<div>
<a href="https://javascript.ru/forum/" rel="nofollow">Форум 4</a>
</div>
<div>
<a href="https://javascript.ru/forum/" rel="noopener">Форум 5</a>
</div>
<div>
<a rel="noopener nofollow" href="https://javascript.ru/forum/">Форум 6</a>
</div>
<div>
<a href=https://javascript.ru/forum/ rel='noopener nofollow'>Форум 7</a>
</div>
<div>
<a href=https://javascript.ru/forum/ rel="">Форум 8</a>
</div>
<div>
<a href=https://javascript.ru/forum/>Форум 9</a>
</div>
</body>
</html>

ksa 14.10.2019 15:23

Цитата:

Сообщение от rusplamen
Здесь jquery не подходит

Это стандартные ЦСС-селекторы... jQuery используется т.с. для пущей иллюстрации. :)

laimas 14.10.2019 15:26

ksa,
если перебирать коллекцию, то нафига вообще нужны рег. выражения, если проще проверить значение атрибута?

ksa 14.10.2019 15:32

Цитата:

Сообщение от laimas
если перебирать коллекцию

Мне лень делать обычный текст... :cray:

Цитата:

Сообщение от laimas
проще проверить значение атрибута

Если в тексте как-то можно проверять атрибуты - проверяй...

ksa 14.10.2019 15:33

Цитата:

Сообщение от laimas
нафига вообще нужны рег. выражения

Цитата:

Сообщение от rusplamen
Мне нужна именно регулярка.

:-?

laimas 14.10.2019 15:43

ksa,
тогда это должен быть текст.

ksa 14.10.2019 15:56

laimas, я с текстом и работаю...

ksa 14.10.2019 16:05

rusplamen, вот, успел пока сделать один вариант регулярки...
В него нужно еще добавить "перевертыш" и будет нужный тебе вариант. ;)

<div>
	<a href="https://javascript.ru/forum/" rel="noopener nofollow">Форум 1</a>
	<a href="https://javascript.ru/forum/" rel="noopener follow">Форум 2</a>
	<a href="https://javascript.ru/forum/" rel="opener nofollow">Форум 3</a>
	<a href="https://javascript.ru/forum/" rel="nofollow">Форум 4</a>
	<a href="https://javascript.ru/forum/" rel="noopener">Форум 5</a>
	<a rel="noopener nofollow" href="https://javascript.ru/forum/">Форум 6</a>
	<a href='https://javascript.ru/forum/' rel=noopener nofollow>Форум 7</a>
	<a href=https://javascript.ru/forum/ rel='noopener nofollow'>Форум 8</a>
	<a href=https://javascript.ru/forum/ rel="">Форум 9</a>
	<a href=https://javascript.ru/forum/>Форум 10</a>
</div>
<div></div>
<script type='text/javascript'>
	var re=/<a href=["']?https:\/\/javascript\.ru\/forum\/["']? rel=["']?[^"']*(noopener|nofollow).+<\/a>/g;
	var o=document.getElementsByTagName('div');
	var str=o[0].innerHTML;
	str=str.replace(re);
	o[1].innerHTML=str;
</script>

laimas 14.10.2019 16:25

Цитата:

Сообщение от ksa
и будет нужный тебе вариант

Да мне нафик не нужно никакого. :p Я не знаю что есть чего нет Google App Script в полном объеме, но уж как-то странно все это выглядит.

ksa 15.10.2019 07:25

Цитата:

Сообщение от laimas
Да мне нафик не нужно никакого.

А ты-то тут вообще при чем? :blink:
То же мне звизда! :D

ksa 15.10.2019 07:39

rusplamen, вот, вроде как окончательный вариант... :)

<style type='text/css'>
textarea {
	width: 48%;
	height: 200px;
}
</style>
<textarea>
<a href="https://javascript.ru/forum/" rel="noopener nofollow">Форум 1</a>
<a href="https://javascript.ru/forum/" rel="noopener follow">Форум 2</a>
<a href="https://javascript.ru/forum/" rel="opener nofollow">Форум 3</a>
<a href="https://javascript.ru/forum/" rel="nofollow">Форум 4</a>
<a href="https://javascript.ru/forum/" rel="noopener">Форум 5</a>
<a rel="noopener nofollow" href="https://javascript.ru/forum/">Форум 6</a>
<a href='https://javascript.ru/forum/' rel=noopener nofollow>Форум 7</a>
<a href=https://javascript.ru/forum/ rel='noopener nofollow'>Форум 8</a>
<a href=https://javascript.ru/forum/ rel="">Форум 9</a>
<a href=https://javascript.ru/forum/>Форум 10</a>
</textarea>
<textarea></textarea>
<script type='text/javascript'>
	var re=/<a ((href=["']?https:\/\/javascript\.ru\/forum\/["']? rel=["']?[^"']*(noopener|nofollow))|(rel=["']?[^"']*(noopener|nofollow).*? href=["']?https:\/\/javascript\.ru\/forum\/["']?)).+<\/a>\n/g;
	var o=document.getElementsByTagName('textarea');
	var str=o[0].value;
	str=str.replace(re,'');
	o[1].value=str;
</script>


Часовой пояс GMT +3, время: 20:26.