try this:
function isUrl(s) {
if (!isUrl.rx_url) {
// taken from https://gist.github.com/dperini/729294
isUrl.rx_url=/^(?:(?:https?|ftp)://)?(?:S+(?::S*)?@)?(?:(?!(?:10|127)(?:.d{1,3}){3})(?!(?:169.254|192.168)(?:.d{1,3}){2})(?!172.(?:1[6-9]|2d|3[0-1])(?:.d{1,3}){2})(?:[1-9]d?|1dd|2[01]d|22[0-3])(?:.(?:1?d{1,2}|2[0-4]d|25[0-5])){2}(?:.(?:[1-9]d?|1dd|2[0-4]d|25[0-4]))|(?:(?:[a-zu00a1-uffff0-9]-*)*[a-zu00a1-uffff0-9]+)(?:.(?:[a-zu00a1-uffff0-9]-*)*[a-zu00a1-uffff0-9]+)*(?:.(?:[a-zu00a1-uffff]{2,})).?)(?::d{2,5})?(?:[/?#]S*)?$/i;
// valid prefixes
isUrl.prefixes=['http://', 'https://', 'ftp://', 'www.'];
// taken from https://w3techs.com/technologies/overview/top_level_domain/all
isUrl.domains=['com','ru','net','org','de','jp','uk','br','pl','in','it','fr','au','info','nl','ir','cn','es','cz','kr','ua','ca','eu','biz','za','gr','co','ro','se','tw','mx','vn','tr','ch','hu','at','be','dk','tv','me','ar','no','us','sk','xyz','fi','id','cl','by','nz','il','ie','pt','kz','io','my','lt','hk','cc','sg','edu','pk','su','bg','th','top','lv','hr','pe','club','rs','ae','az','si','ph','pro','ng','tk','ee','asia','mobi'];
}
if (!isUrl.rx_url.test(s)) return false;
for (let i=0; i<isUrl.prefixes.length; i++) if (s.startsWith(isUrl.prefixes[i])) return true;
for (let i=0; i<isUrl.domains.length; i++) if (s.endsWith('.'+isUrl.domains[i]) || s.includes('.'+isUrl.domains[i]+'/') ||s.includes('.'+isUrl.domains[i]+'?')) return true;
return false;
}
function isEmail(s) {
if (!isEmail.rx_email) {
// taken from http://stackoverflow.com/a/16016476/460084
var sQtext = '[^\x0d\x22\x5c\x80-\xff]';
var sDtext = '[^\x0d\x5b-\x5d\x80-\xff]';
var sAtom = '[^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+';
var sQuotedPair = '\x5c[\x00-\x7f]';
var sDomainLiteral = '\x5b(' + sDtext + '|' + sQuotedPair + ')*\x5d';
var sQuotedString = '\x22(' + sQtext + '|' + sQuotedPair + ')*\x22';
var sDomain_ref = sAtom;
var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
var sWord = '(' + sAtom + '|' + sQuotedString + ')';
var sDomain = sSubDomain + '(\x2e' + sSubDomain + ')*';
var sLocalPart = sWord + '(\x2e' + sWord + ')*';
var sAddrSpec = sLocalPart + '\x40' + sDomain; // complete RFC822 email address spec
var sValidEmail = '^' + sAddrSpec + '$'; // as whole string
isEmail.rx_email = new RegExp(sValidEmail);
}
return isEmail.rx_email.test(s);
}
will also recognize urls such as google.com
, http://www.google.bla
, http://google.bla
, www.google.bla
but not google.bla
Решения вопроса 1
text.match(/http[^ ]+/g)
// (3) ["https://vk.com", "https://www.youtube.com", "http://index.com"]
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@zkrvndm
Софт для автоматизации
Если подключен jQuery, то найти можно так:
all_link = jQuery('a:contains("Ютуб")'); // Будут найдены все ссылки содержащие слово Ютуб
alert('Найдено ссылок: ' + all_link.length); // Выводим оповещение о количестве
Похожие вопросы
-
Показать ещё
Загружается…
25 мая 2023, в 05:30
1000 руб./за проект
25 мая 2023, в 05:14
5000 руб./за проект
25 мая 2023, в 02:38
1000 руб./за проект
Минуточку внимания
Today we will show you how to find URLs in string and make a link using JavaScript. Recently I was developing a messaging application where we need to detect the URL from the chat message string and create a clickable HTML link instead of that text. So I am going to share the JavaScript function with you.
Split this example in two different parts
- Detect URLs from the string
- Replace a hyperlink instead of the text URLs
1. Detect URLs from the string
Here, we’ll use the match method of the string along with the regular expression to detect the URLs in text. This method will provide us the list of the URLs in the array.
function detectURLs(message) { var urlRegex = /(((https?://)|(www.))[^s]+)/g; return message.match(urlRegex) } detectURLs(“Visit www.cluemediator.com and subscribe us on https://www.cluemediator.com/subscribe for regular updates.”) // Output: [“www.cluemediator.com”, “https://www.cluemediator.com/subscribe”] |
2. Replace a hyperlink instead of the text URLs
In the next step, we will create a clickable link instead of the URLs. Here, we will use the replace method of the string and that method will be used to create a HTML a
tag in the text.
function replaceURLs(message) { if(!message) return; var urlRegex = /(((https?://)|(www.))[^s]+)/g; return message.replace(urlRegex, function (url) { var hyperlink = url; if (!hyperlink.match(‘^https?://’)) { hyperlink = ‘http://’ + hyperlink; } return ‘<a href=”‘ + hyperlink + ‘” target=”_blank” rel=”noopener noreferrer”>’ + url + ‘</a>’ }); } replaceURLs(“Visit www.cluemediator.com and subscribe us on https://www.cluemediator.com/subscribe for regular updates.”) // Output: Visit <a href=”http://www.cluemediator.com” target=”_blank” rel=”noopener noreferrer”>www.cluemediator.com</a> and subscribe us on <a href=”https://www.cluemediator.com/subscribe” target=”_blank” rel=”noopener noreferrer”>https://www.cluemediator.com/subscribe</a> for regular updates. |
That’s it for today.
Thank you for reading. Happy Coding..!!
If you found value in this article,
you can support us by buying me a coffee! ☕
- Поиск по id
- Поиск по тегу
- Получить всех потомков
-
Поиск по
name
: getElementsByName - Другие способы
Стандарт DOM предусматривает несколько средств поиска элемента. Это методы getElementById
, getElementsByTagName
и getElementsByName
.
Более мощные способы поиска предлагают javascript-библиотеки.
Поиск по id
Самый удобный способ найти элемент в DOM – это получить его по id
. Для этого используется вызов document.getElementById(id)
Например, следующий код изменит цвет текста на голубой в div
‘е c id="dataKeeper"
:
document.getElementById('dataKeeper').style.color = 'blue'
Поиск по тегу
Следующий способ – это получить все элементы с определенным тегом, и среди них искать нужный. Для этого служит document.getElementsByTagName(tag)
. Она возвращает массив из элементов, имеющих такой тег.
Например, можно получить второй элемент(нумерация в массиве идет с нуля) с тэгом li
:
document.getElementsByTagName('LI')[1]
Что интересно, getElementsByTagName
можно вызывать не только для document
, но и вообще для любого элемента, у которого есть тег (не текстового).
При этом будут найдены только те объекты, которые находятся под этим элементом.
Например, следующий вызов получает список элементов LI
, находящихся внутри первого тега div
:
document.getElementsByTagName('DIV')[0].getElementsByTagName('LI')
Получить всех потомков
Вызов elem.getElementsByTagName('*')
вернет список из всех детей узла elem
в порядке их обхода.
Например, на таком DOM:
<div id="d1"> <ol id="ol1"> <li id="li1">1</li> <li id="li2">2</li> </ol> </div>
Такой код:
var div = document.getElementById('d1') var elems = div.getElementsByTagName('*') for(var i=0; i<elems.length; i++) alert(elems[i].id)
Выведет последовательность: ol1, li1, li2
.
Поиск по name
: getElementsByName
Метод document.getElementsByName(name)
возвращает все элементы, у которых имя (атрибут name
) равно данному.
Он работает только с теми элементами, для которых в спецификации явно предусмотрен атрибут name
: это form
, input
, a
, select
, textarea
и ряд других, более редких.
Метод document.getElementsByName
не будет работать с остальными элементами типа div
,p
и т.п.
Другие способы
Существуют и другие способы поиска по DOM: XPath, cssQuery и т.п. Как правило, они реализуются javascript-библиотеками для расширения стандартных возможностей браузеров.
Также есть метод getElementsByClassName
для поиска элементов по классу, но он совсем не работает в IE, поэтому в чистом виде им никто не пользуется.
Частая опечатка связана с отсутствием буквы s в названии метода getElementById
, в то время как в других методах эта буква есть: getElementsByName
.
Правило здесь простое: один элемент – Element
, много – Elements
. Все методы *Elements*
возвращают список узлов.
I suspect that I could much improve upon this, though at the minute this is the best I can offer (albeit I think that some kind of replace might work more efficiently):
var $words = $('p').text().split(' ');
for (i in $words) {
if ($words[i].indexOf('http://') == 0) {
$words[i] = '<a href="' + $words[i] + '">' + $words[i] + '</a>';
}
}
$('p').html($words.join(' '));
JS Fiddle demo.
A slightly improved version of the above (but good lord, it’s ugly…):
var punctuation = ['!',"'",'"',',','.'];
$('p').each(
function(){
$words = $(this).text().split(' ');
for (i in $words){
if ($.inArray($words[i].charAt(0),punctuation) > -1 && $words[i].indexOf('http://') == 1){
alert($words[i]);
}
else if ($.inArray($words[i].charAt($words[i].length - 1),punctuation) > -1 && ($words[i].indexOf('http://') == 1 || $words[i].indexOf('http://') == 0)){
$words[i] = '<a href="'+$words[i].substring(0,$words[i].length-1)+'">' + $words[i].substring(0,$words[i].length-1) + '</a>' + $words[i].charAt($words[i].length-1);
}
else if ($words[i].indexOf('http://') == 0){
$words[i] = '<a href="' + $words[i] + '">' + $words[i] + '</a>';
}
}
$(this).html($words.join(' '));
});
JS Fiddle demo.
I’m not quite sure what to do about quoted links, though (text such as "http://google.com"
, for example); and, honestly, I think that regex is probably the far, far better approach to this problem.