Javascript-使用string.replace替换文本的函数

时间:2011-11-23 03:59:57

标签: javascript regex

我试图通过调用缩短网址的函数来替换字符串中的url,然后替换文本。缩短逻辑工作得很好,我最终得到了正确的替换URL,但是我无法使替换功能正常工作。这是我的代码。

var newtext = shortenUrl(curText);

var shortenUrl = function (text) {
    var exp = /(ftp|http|https):\/\/(?!bit\.ly)(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ig;

    text.replace(exp, 
                 function ($1) {
                      $.getJSON("http://api.bitly.com/v3/shorten?login=xxxxxx&apiKey=xxxx&longUrl=" + escape($1) + "&format=json", 
                                function (result) {
                                    return result.data.url;
                                });
                 });
    return text;
};

result.data.url根据bit.ly API规范包含适当缩短的url;然而, 由于某种原因,newtext始终为空。

2 个答案:

答案 0 :(得分:4)

  1. text.Replace不会更改text =>的内容你需要说text = text.Replace(...)因为javascript中的字符串是不可变的(https://stackoverflow.com/q/51193/4572以获取更多信息)

  2. getJSON以异步方式执行,这意味着您要替换的函数的执行将启动JSON调用但不等待JSON调用完成,您需要使用$ .ajax而不是async选项已关闭(请参阅下面的代码,以及此链接:Is it possible to set async:false to $.getJSON call

  3. 因为JSON调用只是执行一个回调(即函数(结果)),所以它实际上并不返回一个值,所以你需要创建一个所谓的“闭包”才能获得状态(result.data) .url)从函数内部(结果)调用父作用域(在本例中是函数($ 1)创建的作用域)。闭包可能会变得非常混乱,尤其是在javascript中,有时会产生非显而易见的结果。谢天谢地,这是一个简单的闭包。如需了解更多信息,您可以查看此https://stackoverflow.com/q/7363168/4572或Google。

  4. 以下是适合我的代码:

    var shortenUrl = function (text) {
        var exp = /(ftp|http|https):\/\/(?!bit\.ly)(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ig;
    
        text = text.replace(exp, function ($1) {
           var newUrl = "";
           $.ajax({
               url: "http://api.bitly.com/v3/shorten?login=xxxxx&apiKey=xxxxxx&longUrl=" + escape($1) + "&format=json",
               dataType: 'json',
               async: false,
                success: function(result) {
                    newUrl = result.data.url
                }
            });
            return newUrl;
        });
        return text;
    };
    

答案 1 :(得分:0)

由于您调用的函数不是同步的,因此您需要某种回调函数。以下代码应该可以解决问题:

var newtext;
shortenUrl(curText, function(url) {
  newtext = url;
});

var shortenUrl = function (text, callback) {
    var exp = /(ftp|http|https):\/\/(?!bit\.ly)(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ig;

    text = text.replace(exp, 
             function ($1) {
                  $.getJSON("http://api.bitly.com/v3/shorten?login=xxxxxx&apiKey=xxxx&longUrl=" + escape($1) + "&format=json", 
                            function (result) {
                                return result.data.url;
                            });
             });
    callback(text);
};