0

我已经放弃了 - 为什么这不起作用?我正在尝试处理我的消息链接,它有效,但并非一直有效。这是jsFiddle,我认为问题的核心在下面的编辑 2中。

它贯穿该函数并执行除过滤器循环之外的所有操作...。如果您查看控制台,您会看到它 remove 对每个<a></a>标签的内部文本执行正则表达式,但由于某种原因它不会保留一路改变!我究竟做错了什么?

JavaScript(使用 jQuery):

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

    //URLs starting with "www." (without // before it, or it'd re-link the ones done above).
    replacePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
    messagetext = messagetext.replace(replacePattern2, '$1<a class="individualMessageBioWhateverLink" href="http://$2" target="_blank">$2</a>');
    console.log('replacePatter2: ' + messagetext);
    // Ignore this block of code, it's just for future visitors that want to link #hashtags and @usernames - it works perfectly!
    /*
         exp = /(^|\s)#(\w+)/g;
       text = text.replace(exp, "$1<a class='individualMessageBioWhateverHash' href='http://search.twitter.com/search?q=%23$2' target='_blank'>#$2</a>");
       console.log(text);

        exp = /(^|\s)@(\w+)/g;
        text = text.replace(exp, "$1<a class='individualMessageBioWhateverMention' href='http://www.twitter.com/$2' target='_blank'>@$2</a>");

        */
    console.log('before the a filter loop: ' + messagetext);
    $(messagetext).filter('a').each(function (e) {
        console.log(this.text);
        var finalexp = /(([a-zA-Z]{3,5}\:\/\/)|(www\.))/gim;
        var something = $(this).text().replace(finalexp, "");
        $(this).text(something);
        console.log(this.text);
        console.log(something);

        /*console.log('after each: ' + this);

         //cleans up stuff like http://www. and https://www. and ftp://www. (obviously not a value URI... - may want to stick to just https?:\/\/ for that reason)
         // /(([a-zA-Z]{3,5}\:\/\/)(www\.))/gim;

         //Cleans up all instances of www. 
         // /(www\.)/gim;
        });
        */
        //console.log(text);
    });
    $("#correctedmessagetext").html(messagetext);
    return messagetext;   
}

var individualMessage = "http://google.com is great, but http://www.stackoverflow.com may be my only hope. www.yahoo.com is out of the question.";
processTweetLinks(individualMessage);

HTML:

<div id="correctedmessagetext"></div>

编辑:我实际上并没有将其输出到 div - 另一个函数的一部分生成一个字符串,并且在该字符串内部是对该函数的调用,本质上是processTweetLinks(individualMessage).

编辑 2:这是代码的简短版本 - 问题一定出在此处:

$(messagetext).filter('a').each(function(e) {
        var finalexp = /(([a-zA-Z]{3,5}\:\/\/)|(www\.))/gim;
        var something = $(this).text().replace(finalexp, "");    
        $(this).text(something);
    });
    return messagetext;
4

1 回答 1

1

看起来您从未在页面上编辑它们。据我所知,您可以分解消息文本字符串(将其放入不同的变量中,然后在更新后将其拼凑在一起),或者您可以将其输出到页面,然后对更正的消息文本进行过滤。所以留下这个:

$("#correctedmessagetext").html(messagetext);

然后将您的过滤器方法更改为适用于更正消息文本 id 的另一种方法,如下所示:

function doFilter() {
     $("#correctedmessagetext").filter('a').each(function (e) {
        console.log(this.text);
        var finalexp = /(([a-zA-Z]{3,5}\:\/\/)|(www\.))/gim;
        var something = $(this).text().replace(finalexp, "");
        $(this).text(something);
        console.log(this.text);
        console.log(something);

        /*console.log('after each: ' + this);

         //cleans up stuff like http://www. and https://www. and ftp://www. (obviously not a value URI... - may want to stick to just https?:\/\/ for that reason)
         // /(([a-zA-Z]{3,5}\:\/\/)(www\.))/gim;

         //Cleans up all instances of www. 
         // /(www\.)/gim;
        });
        */
        //console.log(text);
    });
}

将消息文本输出到页面(上面的单行)后,然后调用您的新方法。

编辑

回顾一下,您已经从之前所做的事情中得到了答案 - 正则表达式替换。我刚刚检查了一下并想出了这个方法:

function messageFilter(messagetext) {
    var replacePattern = /(>)(([a-zA-Z]{3,5}\:\/\/)|(www\.))(www.)?(\w+\.\w+)(<)/g;

    messagetext = messagetext.replace(replacePattern, '$1$6$7');

    console.log(messagetext);
    return messagetext;
}

你可以在我的JS Fiddle上看到它

这样您就不必再执行 $(item).filter('a').each(function(e) 了,您只需调用该方法来修复您的字符串。

于 2013-04-18T22:17:58.103 回答