Составить регулярку
Добрый день всем!
Помогите составить регулярное выражение. Есть в 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> Мне нужна регулярка только. Я пока не очень силён в них. Спасибо! |
<a href='https://javascript.ru/forum/' rel=noopener nofollow> - это ошибка, нельзя оставлять вне кавычек строки с пробелом, да и вообще значения атрибутов вне без кавычек, это не гут.
var a = [...document.getElementsByTagName('a')].filter((a)=>{ return !a.rel }); console.log(a) |
Да, ошибка. Но, встречал такое в коде, что есть без кавычек, но браузер интерпретирует для пользователя с кавычками.
Например, я открываю F12 - атрибут с кавычками, открываю исходный код (Ctrl + U) - тот же атрибут без кавычек. А скрипт, "дергает" именно тот код, который без кавычек. Мне нужна именно регулярка. Я пишу скрипт в GAS (Google App Script). |
Цитата:
<input value=one two /> Значением будет то, что до первого пробела, остальное будет мусором, тоже самое будет и rel=noopener nofollow. |
Цитата:
Достаточно использовать селекторы <!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> |
Цитата:
|
Я пишу на Google App Script. Здесь jquery не подходит
|
Цитата:
|
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,
если перебирать коллекцию, то нафига вообще нужны рег. выражения, если проще проверить значение атрибута? |
Цитата:
Цитата:
|
Цитата:
Цитата:
|
ksa,
тогда это должен быть текст. |
laimas, я с текстом и работаю...
|
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> |
Цитата:
|
Цитата:
То же мне звизда! :D |
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. |