Как я могу идентифицировать простые текстовые адреса веб-сайтов и обернуть их в тег href? [Дубликат]

В первом случае он вызовет метод DoIt () производного класса, потому что новое ключевое слово скрывает метод базового класса DoIt ().

Во втором случае он вызовет overriden DoIt ()

  public class A
{
    public virtual void DoIt()
    {
        Console.WriteLine("A::DoIt()");
    }
}

public class B : A
{
    new public void DoIt()
    {
        Console.WriteLine("B::DoIt()");
    }
}

public class C : A
{
    public override void DoIt()
    {
        Console.WriteLine("C::DoIt()");
    }
}

позволяет создать экземпляр этих классов

   A instanceA = new A();

    B instanceB = new B();
    C instanceC = new C();

    instanceA.DoIt(); //A::DoIt()
    instanceB.DoIt(); //B::DoIt()
    instanceC.DoIt(); //B::DoIt()

Все ожидается выше. Позвольте задать экземпляр B и instanceC в instanceA и вызвать метод DoIt () и проверить результат.

    instanceA = instanceB;
    instanceA.DoIt(); //A::DoIt() calls DoIt method in class A

    instanceA = instanceC;
    instanceA.DoIt();//C::DoIt() calls DoIt method in class C because it was overriden in class C
405
задан Peter Mortensen 13 August 2011 в 20:25
поделиться

24 ответа

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

ссылка: https: // github. ком / alexcorvi / anchorme.js

290
ответ дан Alex C. 18 August 2018 в 21:34
поделиться
  • 1
    Жаль, что URL regexp from Component не прокомментирован, какое-то объяснение того, что он делает, было бы полезно. Autolinker.js прокомментирован очень хорошо и имеет тесты. Библиотека urlize.js, связанная с ответом Vebjorn Ljosa , также выглядит эффектно и хорошо поддерживается, хотя в ней нет тестов. – Sam Hasler 26 February 2014 в 11:36
  • 2
    Regex101.com автоматически «поясняет» regexp, но удачи в этом :) Я также быстро нашел случай сбоя с недопустимым TLD (той же ссылкой). – Dan Dascalescu 26 February 2014 в 11:44
  • 3
    @SamHasler: автолинкер нуждается в улучшении в области TLD и IDN. Добавлены некоторые тесты . – Dan Dascalescu 26 February 2014 в 12:55
  • 4
    Любопытно, что никто не упомянул об усилиях Джона Грубера по сохранению шаблона регулярного URL URL . Это не единственное / идеальное решение проблемы, но в любом случае стоит исследовать, если вы переворачиваете свое собственное решение. Просто хотел добавить это как ссылку. – oelna 10 June 2014 в 12:25
  • 5
    @DanDascalescu Взгляните на этот markdown-it.github.io/linkify-it . Эта библиотека ориентирована именно на одну задачу - обнаружение шаблонов ссылок в тексте. Но я надеюсь, что все хорошо. Например, он имеет правильную поддержку юникода, включая астральные символы. И он поддерживает международные TLD. – Vitaly 12 February 2015 в 20:02
  • 6
    ссылка мертва – tttony 11 December 2016 в 22:19
  • 7
    @tttony Извините! обновлено. – Alex C. 12 December 2016 в 12:26
  • 8
    Удивительная библиотека. Большое спасибо! – Serdar Değirmenci 7 March 2018 в 12:03
293
ответ дан Alex C. 7 September 2018 в 05:23
поделиться
296
ответ дан Alex C. 30 October 2018 в 09:28
поделиться

Держите это просто! Скажите, что у вас не может быть, а не то, что вы можете иметь:)

Как упоминалось выше, URL-адреса могут быть довольно сложными, особенно после «?», И не все они начинаются с «www». например maps.bing.com/something?key=!"£$%^*()&lat=65&lon&lon=20

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

]

Матч

http(s):// (anything but a space)+

www. (anything but a space)+

Где «что угодно» [^'"<>\s] ... в основном жадный матч, продолжающийся вам встретить пробел, цитату, угловую скобку или конец строки

Также:

Не забудьте проверить, что она еще не в формате URL, например текст содержит href="..." или src="..."

Добавить ref = nofollow (при необходимости)

Это решение не так «хорошо», как упомянутые выше библиотеки, но в значительной степени проще и хорошо работает на практике.

if html.match( /(href)|(src)/i )) {
    return html; // text already has a hyper link in it
    }

html = html.replace( 
            /\b(https?:\/\/[^\s\(\)\'\"\<\>]+)/ig, 
            "<a ref='nofollow' href='$1'>$1</a>" 
            );

html = html.replace( 
            /\s(www\.[^\s\(\)\'\"\<\>]+)/ig, 
            "<a ref='nofollow' href='http://$1'>$1</a>" 
            );

html = html.replace( 
             /^(www\.[^\s\(\)\'\"\<\>]+)/ig, 
            "<a ref='nofollow' href='http://$1'>$1</a>" 
            );

return html;
2
ответ дан Andrew Murphy 18 August 2018 в 21:34
поделиться

Если вам нужно показать более короткую ссылку (только домен), но с таким же длинным URL-адресом, вы можете попробовать изменить версию кода Sam Hasler, опубликованную выше

function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/([-A-Z0-9+&@#%?=~_|!:,.;]*)([-A-Z0-9+&@#%?\/=~_|!:,.;]*)[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(exp, "<a href='$1' target='_blank'>$3</a>");
}
4
ответ дан Artjom Kurapov 18 August 2018 в 21:34
поделиться

Я внес изменения в Roshambo String.linkify () в адрес emailAddressPattern, чтобы узнать адреса aaa.bbb. @ ccc.ddd

if(!String.linkify) {
    String.prototype.linkify = function() {

        // http://, https://, ftp://
        var urlPattern = /\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|]/gim;

        // www. sans http:// or https://
        var pseudoUrlPattern = /(^|[^\/])(www\.[\S]+(\b|$))/gim;

        // Email addresses *** here I've changed the expression ***
        var emailAddressPattern = /(([a-zA-Z0-9_\-\.]+)@[a-zA-Z_]+?(?:\.[a-zA-Z]{2,6}))+/gim;

        return this
            .replace(urlPattern, '<a target="_blank" href="$&">$&</a>')
            .replace(pseudoUrlPattern, '$1<a target="_blank" href="http://$2">$2</a>')
            .replace(emailAddressPattern, '<a target="_blank" href="mailto:$1">$1</a>');
    };
}
10
ответ дан Christian Koch 18 August 2018 в 21:34
поделиться
  • 1
    В приведенном выше коде не будет много тестов для краевых случаев. При обнаружении URL-адресов лучше полагаться на специализированную библиотеку. Вот почему . – Dan Dascalescu 21 February 2014 в 13:16

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

function UriphiMe(text) {
      var exp = /(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*)/ig; 
      return text.replace(exp,"<a href='$1'>$1</a>");
}

Ниже приведены некоторые проверенные строки:

  1. Найдите меня на www.google.com
  2. www
  3. Найдите меня на www. http://www.com
  4. Следуйте за мной: http: //www.nishantwork .wordpress.com
  5. http://www.nishantwork.wordpress.com
  6. Следуйте за мной: http: / /www.nishantwork.wordpress.com
  7. https://stackoverflow.com/users/430803/nishant

Примечание. Если вы не хотите передавать www как действительный, используйте только параметр reg ex: /(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig

282
ответ дан Community 18 August 2018 в 21:34
поделиться
  • 1
    В приведенном выше коде не будет много тестов для краевых случаев. При обнаружении URL-адресов лучше всегда полагаться на специализированную библиотеку. Вот почему . – Dan Dascalescu 21 February 2014 в 07:31

Я искал в google что-то новое и натолкнулся на это:

$('p').each(function(){
   $(this).html( $(this).html().replace(/((http|https|ftp):\/\/[\w?=&.\/-;#~%-]+(?![\w\s?&.\/;#~%"=-]*>))/g, '<a href="$1">$1</a> ') );
});

demo: http://jsfiddle.net/kachibito/hEgvc/1/

Хорошо работает для обычных ссылок.

6
ответ дан degenerate 18 August 2018 в 21:34
поделиться
  • 1
    Что такое & quot; Нормальные ссылки & quot; Вот? Посмотрите на вилку своей демонстрации здесь: jsfiddle.net/hEgvc/27 Люди будут покрывать непокрытые и сделают это легко. URI не так прост в соответствии с RFC3986, и если вы хотите охватить «Нормальные ссылки», Я предлагаю следовать этому регулярному выражению как минимум: ^ (([^: /? #] +):)? (// ([^ /? #] *))? ([^? #] *) (\ ? ([^ #] *))? (# (. *?)) – Ivan 25 March 2016 в 09:31
  • 2
    Я имел в виду что-то в формате http://example.com/folder/folder/folder/ или https://example.org/blah и т. Д. - только ваш типичный формат без сумасшедшего URL, который будет соответствовать 95-99% вариантов использования там. Я использую это для внутренней административной области, поэтому мне не нужно ничего, чтобы поймать крайние случаи или хеш-ссылки. – degenerate 25 March 2016 в 19:06

Лучший сценарий для этого: http://benalman.com/projects/javascript-linkify-process-lin/

7
ответ дан FlycKER 18 August 2018 в 21:34
поделиться

Следует отметить предупреждения о сложности URI, но простой ответ на ваш вопрос: Чтобы заменить каждое соответствие, вам нужно добавить флаг /g в конец RegEx: /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi

3
ответ дан Moritz 18 August 2018 в 21:34
поделиться

Это решение работает, как и многие другие, и фактически использует одно и то же регулярное выражение, как и одно из них, однако вместо возврата строки HTML это вернет фрагмент документа, содержащий элемент A и любые применимые текстовые узлы.

 function make_link(string) {
    var words = string.split(' '),
        ret = document.createDocumentFragment();
    for (var i = 0, l = words.length; i < l; i++) {
        if (words[i].match(/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi)) {
            var elm = document.createElement('a');
            elm.href = words[i];
            elm.textContent = words[i];
            if (ret.childNodes.length > 0) {
                ret.lastChild.textContent += ' ';
            }
            ret.appendChild(elm);
        } else {
            if (ret.lastChild && ret.lastChild.nodeType === 3) {
                ret.lastChild.textContent += ' ' + words[i];
            } else {
                ret.appendChild(document.createTextNode(' ' + words[i]));
            }
        }
    }
    return ret;
}

Есть некоторые предостережения, а именно, с более старой поддержкой IE и textContent.

здесь является демонстрацией.

5
ответ дан rlemon 18 August 2018 в 21:34
поделиться
  • 1
    @DanDascalescu Вместо того, чтобы сползать вниз, возможно, вы предоставите свои кромки. – rlemon 21 February 2014 в 13:58
  • 2
    Нужно ли мне? Взгляните на компонентное регулярное выражение для URL-адресов . Но если вы настаиваете, бегите против набора тестов Ben Alman's . Я начал вводить неудачные тесты, например. для urlize , но вскоре понял, что это стоит делать только для серьезных усилий библиотеки. При всем моем уважении, выше, это ответ StackOverflow, а не библиотека с открытым исходным кодом, пытающаяся правильно проанализировать URL-адреса. – Dan Dascalescu 21 February 2014 в 14:03
  • 3
    поэтому есть краевые случаи. замечательно. эти ответы по-прежнему могут быть полезны для других, и одеяло их вниз похоже на излишний. Другие ответы, которые вы прокомментировали и, по-видимому, опущены do , содержат полезную информацию (а также ваш ответ). не все будут выступать против указанных случаев, и не каждый захочет использовать библиотеку. – rlemon 21 February 2014 в 14:05
  • 4
    В точку. Те, кто не понимает ограничений регулярных выражений, - это те, кто с радостью избавится от первого регулярного выражения от наиболее употребимого ответа и будет работать с ним. Это те люди, которые больше всего должны использовать библиотеки. – Dan Dascalescu 21 February 2014 в 14:08
  • 5
    Но как это оправдание, чтобы проголосовать за каждый ответ с регулярным выражением не с вашими предпочтениями? – rlemon 21 February 2014 в 14:11

Сделал некоторые оптимизации для кода Тревиса Linkify() выше. Я также исправил ошибку, когда адреса электронной почты с форматами типа субдомена не были сопоставлены (например, example@domain.co.uk).

Кроме того, я изменил реализацию, чтобы прототипировать класс String, чтобы элементы могут быть сопоставлены так:

var text = 'address@example.com';
text.linkify();

'http://stackoverflow.com/'.linkify();

В любом случае, вот сценарий:

if(!String.linkify) {
    String.prototype.linkify = function() {

        // http://, https://, ftp://
        var urlPattern = /\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|]/gim;

        // www. sans http:// or https://
        var pseudoUrlPattern = /(^|[^\/])(www\.[\S]+(\b|$))/gim;

        // Email addresses
        var emailAddressPattern = /[\w.]+@[a-zA-Z_-]+?(?:\.[a-zA-Z]{2,6})+/gim;

        return this
            .replace(urlPattern, '<a href="$&">$&</a>')
            .replace(pseudoUrlPattern, '$1<a href="http://$2">$2</a>')
            .replace(emailAddressPattern, '<a href="mailto:$&">$&</a>');
    };
}
62
ответ дан Roshambo 18 August 2018 в 21:34
поделиться
  • 1
    Лучшие на мой взгляд, поскольку функции Prototype делают вещи намного чище :) – MRVDOG 25 January 2014 в 17:35
  • 2
    кажется, что он не работает с такими адресами электронной почты: info@some-thing.com some.thing@example.com и т. д. – Marco Gagliardi 7 October 2014 в 12:24
  • 3
    @MarcoGagliardi Хороший улов. Исправлена. – Roshambo 17 October 2014 в 18:35
  • 4
    Это не работает для строки «git clone aaaa@bitbucket.org/ooo/bbb-cc-dd.git" ;. Он разбил строку на куски и создал несколько якорей типа «git clone & lt; a href =" https: // & lt; a href = "mailto: aaaa@bitbucket.org" & gt; aaaa@bitbucket.org< /a>/ooo/bbb-cc-dd.git">https://<a href = & quot; mailto: aaaa@bitbucket.org" & gt; aaaa@bitbucket.org< / a & gt; / ooo / bbb -cc-dd.git & л; / а & GT; & Quot; – Jebin 29 October 2015 в 08:51
  • 5
    Он не работает с + в именах писем электронной почты, таких как foo+bar@domain.com. Я исправил его с помощью шаблона электронной почты /[\w.+]+@[a-zA-Z_-]+?(?:\.[a-zA-Z]{2,6})+/gim (обратите внимание на + в первых скобках), но я не знаю, что это сломает что-то еще. – weltschmerz 7 January 2016 в 07:30

Спасибо, это было очень полезно. Я также хотел, чтобы что-то связало вещи, которые выглядели как URL-адрес - в качестве основного требования, это связало бы что-то вроде www.yahoo.com, даже если префикс протокола http: // отсутствовал. Так что в принципе, если «www». присутствует, он свяжет его и предположим, что это http: //. Я также хотел, чтобы электронные письма превращались в mailto: links. ПРИМЕР: www.yahoo.com будет преобразован в www.yahoo.com

Вот код, в котором я оказался (комбинация кода с этой страницы и других вещей, которые я нашел в Интернете, и других вещей, которые я сделал мой собственный):

function Linkify(inputText) {
    //URLs starting with http://, https://, or ftp://
    var replacePattern1 = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim;
    var replacedText = inputText.replace(replacePattern1, '<a href="$1" target="_blank">$1</a>');

    //URLs starting with www. (without // before it, or it'd re-link the ones done above)
    var replacePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
    var replacedText = replacedText.replace(replacePattern2, '$1<a href="http://$2" target="_blank">$2</a>');

    //Change email addresses to mailto:: links
    var replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
    var replacedText = replacedText.replace(replacePattern3, '<a href="mailto:$1">$1</a>');

    return replacedText
}

Во второй замене часть (^ | [^ /]) заменяет только www.whatever.com, если она еще не префикс // - для избежания двойного -связывание, если URL-адрес уже был связан в первой замене. Кроме того, возможно, что www.whatever.com может быть в начале строки, которая является первым «или» условием в этой части регулярного выражения.

Это может быть интегрировано как плагин jQuery как Jesse P, показанный выше, но я специально хотел использовать регулярную функцию, которая не действует на существующий элемент DOM, потому что я беру текст, который у меня есть, а затем добавляю его в DOM, и я хочу, чтобы текст был «привязан», прежде чем добавить его, поэтому я передаю текст через эту функцию. Отлично работает.

130
ответ дан Sam Hasler 18 August 2018 в 21:34
поделиться
  • 1
    как отредактировать этот код, чтобы не нанести вред встроенным объектам и iframes .. (встроенные объекты youtube и iframes) – Pradyut Bhattacharya 10 December 2010 в 21:54
  • 2
    В коде есть код, который соответствует адресам электронной почты здесь. [a-zA-Z]{2,6} должен читать что-то по строкам (?:[a-zA-Z]{2,6})+, чтобы соответствовать более сложным именам доменов, т. е. email@example.co.uk. – Roshambo 19 August 2011 в 16:07
  • 3
    Хотелось бы, чтобы я мог дать вам больше одного взлёта за это :) – tybro0103 29 August 2011 в 16:42
  • 4
    Я столкнулся с некоторыми проблемами; сначала просто http: // или http: // www (без пробела www , даже если SO разбирает это неправильно) создаст ссылку. И ссылки с http: // www. домен . com (без пробелов) создаст одну пустую ссылку, а затем одну с прикрепленным тегом закрытия привязки в поле href. – Alfred 18 October 2011 в 22:36
  • 5
    Существует проблема со вторым шаблоном, который соответствует простому «www.domain.com». все само по себе. Проблема возникает, когда URL-адрес имеет в своем роде ссылку, например: & amp; location = http% 3A% 2F% 2Fwww.amazon.com% 2FNeil-Young% 2Fe% 2FB000APYJWA% 3Fqid% 3D1280679945% 26sr% 3D8-2-ent & amp ; tag = tra0c7-20 & linkCode = ur2 & amp; camp = 1789 & amp; creative = 9325 - и в этом случае ссылка автоматически связана. Быстрое исправление заключается в том, чтобы добавить символ & quot; f & quot; после списка с отрицанием, который содержит «/». Итак, выражение: replacePattern2 = /(^|[^\/f])(www\.[\S]+(\b|$))/gim – Redtopia 19 November 2012 в 06:39
  • 6
    Я попытался отредактировать исходное сообщение, чтобы исправить проблему mailto, но для редактирования нужно добавить не менее 6 символов. Но если вы измените эту строку: replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim; с этим replacePattern3 = /(\w+@[a-zA-Z_]+?(\.[a-zA-Z]{2,6})+)/gim;, который исправляет проблему mailto :) – yourdeveloperfriend 14 June 2013 в 19:17
  • 7
    В приведенном выше коде не будет много тестов для краевых случаев. При обнаружении URL-адресов лучше полагаться на специализированную библиотеку. Вот почему . – Dan Dascalescu 21 February 2014 в 13:15
  • 8
    Я просто запустил его на строке, где некоторые из веб-ссылок уже имеют ссылки href на них. В этом случае он не вмешивается в существующие рабочие ссылки. – AdamJones 9 April 2014 в 16:02

Идентификация URL-адресов сложна, потому что они часто окружены знаками препинания и потому, что пользователи часто не используют полную форму URL-адреса. Многие функции JavaScript существуют для замены URL-адресов гиперссылками, но мне не удалось найти тот, который работает, а также фильтр urlize в веб-среде Django на основе Python. Поэтому я перенес функцию Django urlize в JavaScript:

https://github.com/ljosa/urlize.js

Пример:

urlize('Go to SO (stackoverflow.com) and ask. <grin>', 
       {nofollow: true, autoescape: true})
=> "Go to SO (<a href="http://stackoverflow.com" rel="nofollow">stackoverflow.com</a>) and ask. &lt;grin&gt;"

Второй аргумент, если true, вызывает rel="nofollow". Третий аргумент, если true, ускользает от символов, имеющих особое значение в HTML. См. файл README .

17
ответ дан Vebjorn Ljosa 18 August 2018 в 21:34
поделиться
  • 1
    Также работает с источником html, например: www.web.com & lt; a href = & quot; https: // github. com " & GT; url & lt; / a & gt; какой-то текст – Paulius Zaliaduonis 25 May 2012 в 15:50
  • 2
    @Paulius: если вы установите опцию django_compatible на false, она будет обрабатывать этот вариант использования немного лучше. – Vebjorn Ljosa 26 May 2012 в 12:29
  • 3
    Django urlize не поддерживает TLD правильно (по крайней мере, не JS-порт GitHub). Библиотека, которая правильно обрабатывает TLD , - это JavaScript Бенджана Бен Альмана . – Dan Dascalescu 21 February 2014 в 04:18
  • 4
    Поддержка обнаружения URL-адресов с дополнительными доменами верхнего уровня, даже если URL-адрес не начинается с & quot; http & quot; или "www" был добавлен. – Vebjorn Ljosa 21 February 2014 в 16:34

Исправить обнаружение URL-адресов с помощью международных доменов и amp; поддержка астральных персонажей - это не тривиальная вещь. linkify-it библиотека создает регулярное выражение из во многих условиях , а конечный размер составляет около 6 килобайт :).

См. linkify-it demo , чтобы проверить живые все грани и проверить свои.

Если вам нужно связать источник HTML, вы должны сначала его разобрать и повторить каждый текстовый токен.

1
ответ дан Vitaly 18 August 2018 в 21:34
поделиться

Вот мое решение:

var content = "Visit https://wwww.google.com or watch this video: https://www.youtube.com/watch?v=0T4DQYgsazo and news at http://www.bbc.com";
content = replaceUrlsWithLinks(content, "http://");
content = replaceUrlsWithLinks(content, "https://");

function replaceUrlsWithLinks(content, protocol) {
    var startPos = 0;
    var s = 0;

    while (s < content.length) {
        startPos = content.indexOf(protocol, s);

        if (startPos < 0)
            return content;

        let endPos = content.indexOf(" ", startPos + 1);

        if (endPos < 0)
            endPos = content.length;

        let url = content.substr(startPos, endPos - startPos);

        if (url.endsWith(".") || url.endsWith("?") || url.endsWith(",")) {
            url = url.substr(0, url.length - 1);
            endPos--;
        }

        if (ROOTNS.utils.stringsHelper.validUrl(url)) {
            let link = "<a href='" + url + "'>" + url + "</a>";
            content = content.substr(0, startPos) + link + content.substr(endPos);
            s = startPos + link.length;
        } else {
            s = endPos + 1;
        }
    }

    return content;
}

function validUrl(url) {
    try {
        new URL(url);
        return true;
    } catch (e) {
        return false;
    }
}
0
ответ дан AndroidDev 18 August 2018 в 21:34
поделиться

После ввода нескольких источников у меня есть решение, которое работает хорошо. Это было связано с написанием собственного кода замены.

Ответ .

Fiddle .

function replaceURLWithHTMLLinks(text) {
    var re = /(\(.*?)?\b((?:https?|ftp|file):\/\/[-a-z0-9+&@#\/%?=~_()|!:,.;]*[-a-z0-9+&@#\/%=~_()|])/ig;
    return text.replace(re, function(match, lParens, url) {
        var rParens = '';
        lParens = lParens || '';

        // Try to strip the same number of right parens from url
        // as there are left parens.  Here, lParenCounter must be
        // a RegExp object.  You cannot use a literal
        //     while (/\(/g.exec(lParens)) { ... }
        // because an object is needed to store the lastIndex state.
        var lParenCounter = /\(/g;
        while (lParenCounter.exec(lParens)) {
            var m;
            // We want m[1] to be greedy, unless a period precedes the
            // right parenthesis.  These tests cannot be simplified as
            //     /(.*)(\.?\).*)/.exec(url)
            // because if (.*) is greedy then \.? never gets a chance.
            if (m = /(.*)(\.\).*)/.exec(url) ||
                    /(.*)(\).*)/.exec(url)) {
                url = m[1];
                rParens = m[2] + rParens;
            }
        }
        return lParens + "<a href='" + url + "'>" + url + "</a>" + rParens;
    });
}
0
ответ дан Community 18 August 2018 в 21:34
поделиться
  • 1
    Вышеприведенный код (и большинство регулярных выражений в целом) не даст большого количества тестов для краевых случаев. При обнаружении URL-адресов лучше полагаться на специализированную библиотеку. Вот почему . – Dan Dascalescu 21 February 2014 в 13:17
  • 2
    Дэн, есть ли такая библиотека? Хотя в этом случае мы все равно будем сопоставлять приведенное выше регулярное выражение, чтобы код никогда не выводил мусор, когда в качестве входного сигнала использовался какой-то мусор (даже если другая библиотека удостоверяет мусор как действительный URL / URI). – Mike Mestnik 12 January 2015 в 10:33

Заменить URL-адреса в тексте ссылками HTML, игнорировать URL-адреса в теге href / pre. https://github.com/JimLiu/auto-link

0
ответ дан Jim Liu 18 August 2018 в 21:34
поделиться

Обнаружение электронной почты в ответе Travitron выше не работает для меня, поэтому я расширил / заменил его следующим кодом (C #).

// Change e-mail addresses to mailto: links.
const RegexOptions o = RegexOptions.Multiline | RegexOptions.IgnoreCase;
const string pat3 = @"([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,6})";
const string rep3 = @"<a href=""mailto:$1@$2.$3"">$1@$2.$3</a>";
text = Regex.Replace(text, pat3, rep3, o);

Это позволяет использовать адреса электронной почты, такие как " firstname.secondname@one.two.three.co.uk ".

0
ответ дан Peter Mortensen 18 August 2018 в 21:34
поделиться
  • 1
    В приведенном выше коде не будет много тестов для краевых случаев. При обнаружении URL-адресов лучше всегда полагаться на специализированную библиотеку. Вот почему . – Dan Dascalescu 21 February 2014 в 07:32
  • 2
    Спасибо, @DanDascalescu Обычно, always лучше переопределить. – Uwe Keim 21 February 2014 в 07:58

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

var exp = /<a\s.*href=['"](\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])['"].*>.*<\/a>/ig;

source = source.replace(exp,"$1");
0
ответ дан user 18 August 2018 в 21:34
поделиться
  • 1
    Я не вижу смысла в вашем регулярном выражении. Он соответствует всему, что заменяет все на все. В действительности ваш код ничего не делает. – Chad Grant 27 April 2009 в 04:24
  • 2
    Думаю, я должен подождать, чтобы прокомментировать, чтобы люди могли закончить редактирование. Прости. – Chad Grant 27 April 2009 в 04:27
282
ответ дан Community 7 September 2018 в 05:23
поделиться
130
ответ дан Sam Hasler 7 September 2018 в 05:23
поделиться
282
ответ дан Community 30 October 2018 в 09:28
поделиться
133
ответ дан Sam Hasler 30 October 2018 в 09:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: