Javascript Regex для замены URL ссылками, но не в тегах для вставки - PullRequest
1 голос
/ 01 февраля 2010

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

Однако, когда у нас есть теги для встраивания в div, он портит ссылки в этих тегах.

function replaceURLWithHTMLLinks(text) { 
    return text.replace(/(ftp|http|https|file):\/\/[\S]+(\b|$)/gim,'<a href="$&" class="my_link" target="_blank">$&</a>').replace(/([^\/])(www[^ <]+(\b|$))/gim,'$1<a href="http://$2" class="my_link" target="_blank">$2</a>');
}

$(document).ready(function(){
    var htmlStr = $("div.content-a").html();
    var htmlStrAfter = replaceURLWithHTMLLinks(htmlStr);
    $("div.content-a").html(htmlStrAfter);
});

Может кто-нибудь сказать, как, возможно, исключить любые http: // ..., которым предшествует "или"?

или подобное?

Ответы [ 2 ]

3 голосов
/ 01 февраля 2010

Возможно, вам следует использовать DOM в соответствии с рекомендациями. Но чтобы заставить ваше регулярное выражение работать так, как вам нужно, вы должны добавить к нему (?:^|[^"']). Это означает совпадение начала строки или совпадение с любым символом, кроме ' и ". Итак, первое из ваших регулярных выражений будет выглядеть следующим образом:

/(?:^|[^"'])(ftp|http|https|file):\/\/[\S]+(\b|$)/gim  

И ваша цепочка из метода replace ужасна. Код будет намного более читабельным, если вы разделите вызовы метода на разные строки.

Обновление: и чтобы пропустить первый лишний символ, вы можете использовать $1 вместо $&, и ваше регулярное выражение должно быть изменено на:

/(?:^|[^"'])((ftp|http|https|file):\/\/[\S]+(\b|$))/gim  
0 голосов
/ 01 февраля 2010

+ 1 к тому, что говорит Йоханнес ...

    $(document).ready(function(){
       $('div.content').contents().filter(function() {
         return this.nodeType == 3;
       }).each(function(){
             this.nodeValue.replace(/(ftp|http|https|file):\/\/[\S]+(\b|$)/gim,'<a href="$&" class="my_link" target="_blank">$&</a>').replace(/([^\/])(www[^ <]+(\b|$))/gim,'$1<a href="http://$2" class="my_link" target="_blank">$2</a>');
       });
    });

Обратите внимание, что приведенный выше код не проверен, но я должен выглядеть примерно так:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...