Определить URL в тексте с помощью JavaScript

151

У кого-нибудь есть предложения по обнаружению URL в наборе строк?

arrayOfStrings.forEach(function(string){
  // detect URLs in strings and do something swell,
  // like creating elements with links.
});

Обновление: я использовал это регулярное выражение для обнаружения ссылок ... Видимо, через несколько лет.

kLINK_DETECTION_REGEX = /(([a-z]+:\/\/)?(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi

Полный помощник (с дополнительной поддержкой Handlebars) находится в # 1654670 .

arbales
источник
11
Вероятно, не стоит пытаться перечислять конечный набор TLD, поскольку они продолжают создавать новые.
Maxy-B
Согласен. Иногда нам нужен обновляемый код с TLD. На самом деле можно создать скрипт для добавления TLD в регулярные выражения или динамическое обновление кода TLD в коде. В жизни есть вещи, которые нужно стандартизировать, такие как TLD и Timezone. Конечный контроль может быть полезен для проверки существующих проверяемых URL-адресов «TLD» для варианта использования адреса реального мира.
Эдвард Чан JW

Ответы:

217

Сначала вам нужно хорошее регулярное выражение, соответствующее URL. Это сложно сделать. Смотрите здесь , здесь и здесь :

... почти все является действительным URL. Существуют некоторые правила пунктуации для разбиения. В отсутствие каких-либо знаков препинания у вас все еще есть действующий URL.

Внимательно проверьте RFC и посмотрите, сможете ли вы создать «недействительный» URL. Правила очень гибкие.

Например, :::::действительный URL. Путь есть ":::::". Довольно глупое имя файла, но допустимое имя файла.

Кроме того, /////это действительный URL. Netloc ("имя хоста") есть "". Путь есть "///". Опять глупо. Также действует. Этот URL нормализуется по отношению к "///" которому является эквивалентом.

Нечто подобное "bad://///worse/////" совершенно справедливо. Тупой, но действительный.

В любом случае, этот ответ предназначен не для того, чтобы дать вам лучшее регулярное выражение, а скорее как доказательство того, как выполнять перенос строк внутри текста с помощью JavaScript.

ОК, так что давайте просто использовать это: /(https?:\/\/[^\s]+)/g

Опять же, это плохое регулярное выражение . У него будет много ложных срабатываний. Однако этого достаточно для этого примера.

function urlify(text) {
  var urlRegex = /(https?:\/\/[^\s]+)/g;
  return text.replace(urlRegex, function(url) {
    return '<a href="' + url + '">' + url + '</a>';
  })
  // or alternatively
  // return text.replace(urlRegex, '<a href="$1">$1</a>')
}

var text = 'Find me at http://www.example.com and also at http://stackoverflow.com';
var html = urlify(text);

console.log(html)

// html now looks like:
// "Find me at <a href="http://www.example.com">http://www.example.com</a> and also at <a href="http://stackoverflow.com">http://stackoverflow.com</a>"

Итак, в сумме попробуйте:

$$('#pad dl dd').each(function(element) {
    element.innerHTML = urlify(element.innerHTML);
});
Свежий полумесяц
источник
4
Некоторые примеры «многих ложных срабатываний» могут значительно улучшить этот ответ. В противном случае будущие гуглеры просто останутся (возможно, действительными?) FUD.
cmcculloh
Я никогда не знал, что вы можете передать функцию в качестве второго параметра для .replace: |
Амир Африди
4
Это хорошо, но делает "неправильную" вещь с конечными text="Find me at http://www.example.com, and also at http://stackoverflow.com."результатами пунктуации в двух 404-х годах. Некоторые пользователи знают об этом и добавляют пробел после URL перед пунктуацией, чтобы избежать поломки, но большинство используемых мной компоновщиков (Gmail, etherpad, phabricator) отделяют конечную пунктуацию от URL.
skierpage
Если текст уже содержит привязанный URL, вы можете использовать функцию removeAnchors (text) {var div = $ ('<div> </ div>'). Html (text); div.find ( 'а') содержание () Развертка ()..; return div.text (); } сначала удалить якоря перед возвратом text.replace
Muneeb Mirza
Если текст уже содержит привязанный URL, вы используете jquery для удаления привязки, но я использую Angular. Как я могу удалить якорь в Angular?
Сачин Джагтап,
132

Вот что я использовал в качестве своего регулярного выражения:

var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;

Это не включает конечную пунктуацию в URL. Функция полумесяца работает как шарм :) так:

function linkify(text) {
    var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(urlRegex, function(url) {
        return '<a href="' + url + '">' + url + '</a>';
    });
}
Ниаз Мохаммед
источник
4
Наконец, регулярное выражение, которое действительно работает в наиболее очевидном случае! Этот заслуживает закладки. Я проверял тысячи примеров из поиска в Google, пока не нашел это.
Исмаэль
6
Просто и приятно! Но его urlRegexследует определять снаружи, так linkify как его компиляция стоит дорого.
BM
1
Не удается определить полный URL-адрес: disney.wikia.com/wiki/Pua_(Moana)
Jry9972
1
Я добавил ()в каждый список символов, и теперь это работает.
Гийом Ф.
3
он не может определить URL, начинающийся только с www. например: www.facebook.com
CraZyDroiD
51

Я довольно долго гуглял эту проблему, потом мне пришло в голову, что есть метод Android, android.text.util.Linkify, который использует некоторые довольно надежные регулярные выражения для достижения этой цели. К счастью, Android с открытым исходным кодом.

Они используют несколько разных шаблонов для сопоставления разных типов URL. Вы можете найти их все здесь: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/text/util/Regex.java#Regex. 0WEB_URL_PATTERN

Если вас интересуют только те URL, которые соответствуют WEB_URL_PATTERN, то есть URL, соответствующие спецификации RFC 1738, вы можете использовать это:

/((?:(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;

Вот полный текст источника:

"((?:(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}\\.)+"   // named host
+ "(?:"   // plus top level domain
+ "(?: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]" // or ip address
+ "[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})?)" // plus option port number
+ "(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~"  // plus option query params
+ "\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?"
+ "(?:\\b|$)";

Если вы хотите быть по-настоящему модным, вы также можете проверить адреса электронной почты. Регулярное выражение для адресов электронной почты:

/[a-zA-Z0-9\\+\\.\\_\\%\\-]{1,256}\\@[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}(\\.[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25})+/gi

PS: домены верхнего уровня, поддерживаемые вышеприведенным регулярным выражением, действуют по состоянию на июнь 2007 года. Для получения актуального списка вам необходимо проверить https://data.iana.org/TLD/tlds-alpha-by-domain.txt. ,

Адам
источник
3
Поскольку у вас есть регистрозависимое регулярное выражение, вам не нужно указывать a-zA-Zи http|https|Http|Https|rtsp|Rtsp.
Ry-
4
Это хорошо, но я не уверен, что когда-нибудь буду этим пользоваться. В большинстве случаев я предпочел бы принять некоторые ложные срабатывания, чем использовать подход, основанный на жестко закодированном списке TLD. Если вы перечислите TLD в своем коде, вы гарантируете, что он однажды устареет, и я бы не стал встраивать обязательное обслуживание в будущем в мой код, если смогу его избежать.
Марк Амери
3
Это работает в 101% случаев, к сожалению, он также находит URL, которым не предшествует пробел. Если я запускаю совпадение на hello@mydomain.com, он ловит mydomain.com. Есть ли способ улучшить это, чтобы поймать его, только если у него есть место перед ним?
Deminetix
Также отметим, что это идеально подходит для ловли введенных пользователем URL-адресов
Deminetix
Обратите внимание, что grepcode.com больше не работает, вот что я думаю , это ссылка на нужное место в исходном коде Android. Я думаю, что регулярное использование Android может быть обновлено с 2013 года (оригинальное сообщение), но, по-видимому, оно не обновлялось с 2015 года и, следовательно, может отсутствовать некоторые новые TLD.
Джеймс
19

Основано на ответе Crescent Fresh

если вы хотите обнаружить ссылки с http: // ИЛИ без http: // и с помощью www. Вы можете использовать следующее

function urlify(text) {
    var urlRegex = /(((https?:\/\/)|(www\.))[^\s]+)/g;
    //var urlRegex = /(https?:\/\/[^\s]+)/g;
    return text.replace(urlRegex, function(url,b,c) {
        var url2 = (c == 'www.') ?  'http://' +url : url;
        return '<a href="' +url2+ '" target="_blank">' + url + '</a>';
    }) 
}
h0mayun
источник
Это хорошее решение, но я также хочу проверить, что в тексте не должно быть href. Я пробовал это регулярное выражение = /((?!href)((https?:\/\/)|(www\.)|(mailto:))[^\s]+)/gi, но это не работает. Можете ли вы помочь мне с этим или почему вышеприведенное регулярное выражение не работает.
Сачин Джагтап
Мне нравится, что вы также добавили target = "_ blank" в возвращаемый результат. Эта версия - то, что я хотел. Ничего лишнего (иначе я бы использовал Linkifyjs), просто чтобы получить большинство ссылок.
Майкл Кублер
18

Эта библиотека в NPM выглядит довольно полной https://www.npmjs.com/package/linkifyjs

Linkify - небольшой, но всеобъемлющий плагин JavaScript для поиска URL-адресов в виде простого текста и преобразования их в ссылки HTML. Он работает со всеми действительными URL-адресами и адресами электронной почты.

Дэн Кантор
источник
4
Я только что закончил реализацию linkifyjs в моем проекте, и это фантастика. Linkifyjs должен быть ответом на этот вопрос. Другой, на что можно посмотреть, это github.com/twitter/twitter-text
Uber Schnoz
6

Функция может быть улучшена для визуализации изображений:

function renderHTML(text) { 
    var rawText = strip(text)
    var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   

    return rawText.replace(urlRegex, function(url) {   

    if ( ( url.indexOf(".jpg") > 0 ) || ( url.indexOf(".png") > 0 ) || ( url.indexOf(".gif") > 0 ) ) {
            return '<img src="' + url + '">' + '<br/>'
        } else {
            return '<a href="' + url + '">' + url + '</a>' + '<br/>'
        }
    }) 
} 

или для уменьшенного изображения, которое ссылается на изображение полного размера:

return '<a href="' + url + '"><img style="width: 100px; border: 0px; -moz-border-radius: 5px; border-radius: 5px;" src="' + url + '">' + '</a>' + '<br/>'

А вот функция strip (), которая предварительно обрабатывает текстовую строку для единообразия, удаляя любой существующий html.

function strip(html) 
    {  
        var tmp = document.createElement("DIV"); 
        tmp.innerHTML = html; 
        var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   
        return tmp.innerText.replace(urlRegex, function(url) {     
        return '\n' + url 
    })
} 
Гаутам Шарма
источник
2
let str = 'https://example.com is a great site'
str.replace(/(https?:\/\/[^\s]+)/g,"<a href='$1' target='_blank' >$1</a>")

Короткий код Большая работа! ...

Результат: -

 <a href="https://example.com" target="_blank" > https://example.com </a>
Кашан Хайдер
источник
1

Существует пакет npm: url-regex , просто установите его с помощью yarn add url-regexили npm install url-regexи используйте следующее:

const urlRegex = require('url-regex');

const replaced = 'Find me at http://www.example.com and also at http://stackoverflow.com or at google.com'
  .replace(urlRegex({strict: false}), function(url) {
     return '<a href="' + url + '">' + url + '</a>';
  });
Vedmant
источник
0

tmp.innerText не определен. Вы должны использовать tmp.innerHTML

function strip(html) 
    {  
        var tmp = document.createElement("DIV"); 
        tmp.innerHTML = html; 
        var urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   
        return tmp.innerHTML .replace(urlRegex, function(url) {     
        return '\n' + url 
    })
Ан Бинь Тронг
источник
0

попробуй это:

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]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\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);
}

также признают URLs , такие как google.com, http://www.google.bla, http://google.bla, www.google.blaно неgoogle.bla

kofifus
источник
0

Вы можете использовать это регулярное выражение для извлечения нормальных шаблонов URL.

(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})

Если вам нужны более сложные шаблоны, используйте такую ​​библиотеку.

https://www.npmjs.com/package/pattern-dreamer

Кан Эндрю
источник
Какова цель (?:www\.|(?!www))? Почему должен wwwww.comбыть недействительным?
Тото
Ты прав. На самом деле я просто взял это, как многие используют регулярное выражение. Я бы рекомендовал использовать связанную библиотеку выше. Мы должны рассмотреть много случаев в определении URL, поэтому регулярное выражение должно быть более сложным.
Кан Эндрю
0

Универсальное объектно-ориентированное решение

Для таких людей, как я, которые используют такие фреймворки, как angular, которые не позволяют напрямую манипулировать DOM, я создал функцию, которая принимает строку и возвращает массив объектов url/, plainTextкоторые можно использовать для создания любого представления пользовательского интерфейса, которое вы хотите.

URL регулярное выражение

Для сопоставления URL я использовал (слегка адаптированный) h0mayunрегулярное выражение:/(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g

Моя функция также удаляет знаки препинания в конце URL-адреса, например, .и ,я считаю, что это будет скорее пунктуация, чем законное окончание URL-адреса (но это может быть! Это не точная наука, как хорошо объясняют другие ответы). Для этого я применяю следующее регулярное выражение на соответствующих URL /^(.+?)([.,?!'"]*)$/.

Машинописный код

    export function urlMatcherInText(inputString: string): UrlMatcherResult[] {
        if (! inputString) return [];

        const results: UrlMatcherResult[] = [];

        function addText(text: string) {
            if (! text) return;

            const result = new UrlMatcherResult();
            result.type = 'text';
            result.value = text;
            results.push(result);
        }

        function addUrl(url: string) {
            if (! url) return;

            const result = new UrlMatcherResult();
            result.type = 'url';
            result.value = url;
            results.push(result);
        }

        const findUrlRegex = /(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g;
        const cleanUrlRegex = /^(.+?)([.,?!'"]*)$/;

        let match: RegExpExecArray;
        let indexOfStartOfString = 0;

        do {
            match = findUrlRegex.exec(inputString);

            if (match) {
                const text = inputString.substr(indexOfStartOfString, match.index - indexOfStartOfString);
                addText(text);

                var dirtyUrl = match[0];
                var urlDirtyMatch = cleanUrlRegex.exec(dirtyUrl);
                addUrl(urlDirtyMatch[1]);
                addText(urlDirtyMatch[2]);

                indexOfStartOfString = match.index + dirtyUrl.length;
            }
        }
        while (match);

        const remainingText = inputString.substr(indexOfStartOfString, inputString.length - indexOfStartOfString);
        addText(remainingText);

        return results;
    }

    export class UrlMatcherResult {
        public type: 'url' | 'text'
        public value: string
    }
eddyP23
источник
0

Если вы хотите обнаружить ссылки с http: // ИЛИ без http: // ИЛИ ftp ИЛИ с другими возможными случаями, такими как удаление конечной пунктуации в конце, взгляните на этот код.

https://jsfiddle.net/AndrewKang/xtfjn8g3/

Простой способ использовать это - использовать NPM

npm install --save url-knife
Кан Эндрю
источник