如何使用jquery在文本中查找链接?

时间:2011-10-15 19:39:18

标签: javascript jquery html hyperlink

假设我有这样的文字 “这是一个很长的文字。它包含150个字符。您可以在此链接上找到有关此文字的更多信息http://www.somewebsite.com/RDFCCSDVDS”。

因此,在上面的文字中,我想找到该链接并将其转换为链接,以便当用户点击它时,用户将直接进入该网站。

我如何实现这一目标?

5 个答案:

答案 0 :(得分:6)

使用正则表达式:

$('p').html(function(i, text) {
     return text.replace(
         /\bhttp:\/\/([\w\.-]+\.)+[a-z]{2,}\/.+\b/gi,
         '<a href="$&">$&</a>'
     );
});

demo

答案 1 :(得分:3)

我怀疑我可以在很大程度上改进这一点,尽管在这一点上这是我能提供的最好的(尽管我认为某种替换可能更有效):

var $words = $('p').text().split(' ');
for (i in $words) {
    if ($words[i].indexOf('http://') == 0) {
        $words[i] = '<a href="' + $words[i] + '">' + $words[i] + '</a>';
    }
}

$('p').html($words.join(' '));

JS Fiddle demo

上面的一个略微改进的版本(但是好主,它很丑......):

var punctuation = ['!',"'",'"',',','.'];
$('p').each(
    function(){
        $words = $(this).text().split(' ');
        for (i in $words){
            if ($.inArray($words[i].charAt(0),punctuation) > -1 && $words[i].indexOf('http://') == 1){
                alert($words[i]);
            }
            else if ($.inArray($words[i].charAt($words[i].length - 1),punctuation) > -1 && ($words[i].indexOf('http://') == 1 || $words[i].indexOf('http://') == 0)){
                $words[i] = '<a href="'+$words[i].substring(0,$words[i].length-1)+'">' + $words[i].substring(0,$words[i].length-1) + '</a>' + $words[i].charAt($words[i].length-1);
            }
            else if ($words[i].indexOf('http://') == 0){
                $words[i] = '<a href="' + $words[i] + '">' + $words[i] + '</a>';
            }
        }
        $(this).html($words.join(' '));
    });

JS Fiddle demo

我不太确定如何处理引用的链接(例如"http://google.com"之类的文本);老实说,我认为正则表达式可能是解决这个问题的最好方法。

答案 2 :(得分:1)

@Eric解决方案很棒,但我发现如果url后面有空格可能会出错。试试他的jsfiddle示例,其中包含以下文本:

<p>This is a long text. It contains 150 characters. You can find more about this text on this link http://api.som-ewebsite.com/RDFCCS-VDS/#!/?p1=foo&p2=bar right here</p>​​​​​​​​​​​​​​​​​​​​​​​

所以我改变了正则表达式的最新部分,几乎拦截了除了空格之外的每个URL友好字符,这对我来说是一个网址“终结者”(在现实世界中它当然不是,但我不能找到一种方法来分离普通空格和属于纯文本中URL的空格。

$('p').html(function(i, text) {
    return text.replace(
        /\bhttp:\/\/([\w\.-]+\.)+[a-z]{2,}([\/\w\.\-\_\?\=\!\#,\&amp;]+)/gi,
        '<a href="$&">$&</a>'
    );
});​​

我认为可以改进,建议一如既往地欢迎:)

编辑:

无论如何,我认为这是最好的解决方案:How to replace plain URLs with links?

答案 3 :(得分:0)

使用正则表达式

var e = /http:\/\/([A-Za-z0-9\.-_]{2,}\.)+[A-Za-z]{2,}(\/.+)/,
    s = "This is a long text. It contains 150 characters. You can find more about this text on this link http://www.somewebsite.com/RDFCCSDVDS";

if (s.match(e)) {
    var url = RegExp['$&'];
    s = s.replace(url, '<a href="' + url + '">' + url + '</a>');
}

答案 4 :(得分:-3)

在jquery中,您可以使用选择器中的标记来获取页面的所有链接,例如.. $("a")

因此,如果您想对页面上的每个链接执行某些操作,则可以使用

$("a").each(function() {
    //your code here. you can access the link by using $(this)
});