В первом случае он вызовет метод 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
Я написал еще одну библиотеку JavaScript, это может быть лучше для вас, так как это очень чувствительно с наименьшими возможными ложными срабатываниями, быстрыми и маленькими по размеру. Я в настоящее время активно его поддерживаю, поэтому, пожалуйста, проверьте его на демонстрационной странице и посмотрите, как он будет работать для вас.
Держите это просто! Скажите, что у вас не может быть, а не то, что вы можете иметь:)
Как упоминалось выше, 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;
Если вам нужно показать более короткую ссылку (только домен), но с таким же длинным 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>");
}
Я внес изменения в 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>');
};
}
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>");
}
Ниже приведены некоторые проверенные строки:
Примечание. Если вы не хотите передавать www
как действительный, используйте только параметр reg ex: /(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
Я искал в 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/
Хорошо работает для обычных ссылок.
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/
Следует отметить предупреждения о сложности URI, но простой ответ на ваш вопрос: Чтобы заменить каждое соответствие, вам нужно добавить флаг /g
в конец RegEx: /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi
Это решение работает, как и многие другие, и фактически использует одно и то же регулярное выражение, как и одно из них, однако вместо возврата строки 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.
здесь является демонстрацией.
Сделал некоторые оптимизации для кода Тревиса 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>');
};
}
+
в именах писем электронной почты, таких как 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, и я хочу, чтобы текст был «привязан», прежде чем добавить его, поэтому я передаю текст через эту функцию. Отлично работает.
[a-zA-Z]{2,6}
должен читать что-то по строкам (?:[a-zA-Z]{2,6})+
, чтобы соответствовать более сложным именам доменов, т. е. email@example.co.uk.
– Roshambo
19 August 2011 в 16:07
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
Идентификация 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. <grin>"
Второй аргумент, если true, вызывает
rel="nofollow"
. Третий аргумент, если true, ускользает от символов, имеющих особое значение в HTML. См. файл README .
django_compatible
на false, она будет обрабатывать этот вариант использования немного лучше.
– Vebjorn Ljosa
26 May 2012 в 12:29
urlize
не поддерживает TLD правильно (по крайней мере, не JS-порт GitHub). Библиотека, которая правильно обрабатывает TLD , - это JavaScript Бенджана Бен Альмана .
– Dan Dascalescu
21 February 2014 в 04:18
Исправить обнаружение URL-адресов с помощью международных доменов и amp; поддержка астральных персонажей - это не тривиальная вещь. linkify-it
библиотека создает регулярное выражение из во многих условиях , а конечный размер составляет около 6 килобайт :).
См. linkify-it demo , чтобы проверить живые все грани и проверить свои.
Если вам нужно связать источник HTML, вы должны сначала его разобрать и повторить каждый текстовый токен.
Вот мое решение:
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;
}
}
После ввода нескольких источников у меня есть решение, которое работает хорошо. Это было связано с написанием собственного кода замены.
Ответ .
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;
});
}
Заменить URL-адреса в тексте ссылками HTML, игнорировать URL-адреса в теге href / pre. https://github.com/JimLiu/auto-link
Обнаружение электронной почты в ответе 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 ".
Мне нужно было сделать обратное и сделать html-ссылки только в URL-адресе, но я изменил ваше регулярное выражение, и он работает как шарм, спасибо :)
var exp = /<a\s.*href=['"](\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])['"].*>.*<\/a>/ig; source = source.replace(exp,"$1");
URL regexp from Component
не прокомментирован, какое-то объяснение того, что он делает, было бы полезно.Autolinker.js
прокомментирован очень хорошо и имеет тесты. Библиотекаurlize.js
, связанная с ответом Vebjorn Ljosa , также выглядит эффектно и хорошо поддерживается, хотя в ней нет тестов. – Sam Hasler 26 February 2014 в 11:36