Плагин jQuery Linkify: не может обрабатывать ссылки, заканчивающиеся круглыми скобками - PullRequest
2 голосов
/ 02 мая 2011

Я использую этот замечательный плагин: https://github.com/maranomynet/linkify/blob/master/1.0/jquery.linkify-1.0.js

для ссылки на текст, манипулирующий домом. Проблема с такими ссылками: http://en.wikipedia.org/wiki/The_Godfather_(novel)

Ссылка будет "http://en.wikipedia.org/wiki/The_Godfather_(novel"

Что я могу изменить в коде linkify для обработки скобок и т. Д.?

Спасибо!

PS: Эй, похоже, что Stackoverflow тоже может это использовать! хаха;)

РЕДАКТИРОВАТЬ:

Я только что видел сообщение о DaringFireball, оно отлично работает ... Проблема в простых URL-адресах, таких как www.google.com (я думаю, что это связано с первым регулярным выражением для noProtocolUrl). у нас есть прямо сейчас:

var noProtocolUrl = /(^|["'(\s]|<)(www\..+?\..+?)((?:[:?]|\.+)?(?:\s|$)|>|[)"',])/g,
    httpOrMailtoUrl = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:(?:[^\s()<>.]+[.]?)+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi,
        linkifier = function (html) {
            return FormatLink(html
                        .replace(noProtocolUrl, '$1<a href="<``>://$2" rel="nofollow external" class="external_link">$2</a>$3')  // NOTE: we escape `"http` as `"<``>` to make sure `httpOrMailtoUrl` below doesn't find it as a false-positive
                        .replace(httpOrMailtoUrl, '<a href="$1" rel="nofollow external" class="external_link">$1</a>')
                        .replace(/"<``>/g, '"http'));  // reinsert `"http`
        },

С помощью "www.facebook.com" я получаю это (с атрибутами rel и class, такими как текст рядом с ссылкой:

www.facebook.com" rel="nofollow external" class="external_link">www.facebook.com

1 Ответ

1 голос
/ 10 мая 2011

Из того, что я нашел, выражение регулярного выражения, найденное здесь (Первоначально созданный Джоном Грубером из Daring Fireball , модифицированным naren1012 ), похоже, делает трюк.

Для реализации замените этот код:

 var noProtocolUrl = /(^|["'(\s]|&lt;)(www\..+?\..+?)((?:[:?]|\.+)?(?:\s|$)|&gt;|[)"',])/g,
      httpOrMailtoUrl = /(^|["'(\s]|&lt;)((?:(?:https?|ftp):\/\/|mailto:).+?)((?:[:?]|\.+)?(?:\s|$)|&gt;|[)"',])/g,
      linkifier = function ( html ) {
          return html
                      .replace( noProtocolUrl, '$1<a href="<``>://$2">$2</a>$3' )  // NOTE: we escape `"http` as `"<``>` to make sure `httpOrMailtoUrl` below doesn't find it as a false-positive
                      .replace( httpOrMailtoUrl, '$1<a href="$2">$2</a>$3' )
                      .replace( /"<``>/g, '"http' );  // reinsert `"http`
        },

С этим кодом:

 var noProtocolUrl = /(^|["'(\s]|&lt;)(www\..+?\..+?)((?:[:?]|\.+)?(?:\s|$)|&gt;|[)"',])/g,
  httpOrMailtoUrl = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:(?:[^\s()<>.]+[.]?)+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»����]))/gi,
      linkifier = function ( html ) {
          return html
                      .replace( noProtocolUrl, '$1<a href="<``>://$2">$2</a>$3' )  // NOTE: we escape `"http` as `"<``>` to make sure `httpOrMailtoUrl` below doesn't find it as a false-positive
                      .replace(httpOrMailtoUrl, '<a href="$1">$1</a>')
                      .replace( /"<``>/g, '"http' );  // reinsert `"http`
        },
...