2011-11-23 69 views
1

我試圖通過調用縮短url的函數來替換url中的url,然後替換文本。縮短邏輯完美地工作,並且最終得到正確的替換url,但是我無法使替換函數正常工作。這是我的代碼。Javascript-使用string.replace替換文本的函數

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始終爲空。

+0

嘗試使你的'shortenUrl'功能(不是匿名的)。 – Blender

+0

剛纔我剛剛處理了一個這樣的問題。看到這個問題:http://stackoverflow.com/questions/8196889/still-having-problems-returning-value-through-function – rossipedia

回答

4
  1. text.Replace不會改變文本的內容=>你需要說的文本= text.Replace(...),因爲在JavaScript字符串是不可變(https://stackoverflow.com/q/51193/4572獲取更多信息)

  2. 的getJSON異步意味着你喂以取代將啓動JSON呼叫,但不等待JSON調用完成函數的執行進行,你需要使用$阿賈克斯而不是關閉異步選項(請參閱下面的代碼,以及此鏈接:Is it possible to set async:false to $.getJSON call

  3. 由於JSON調用僅執行回調(即函數(結果)),因此它實際上不會返回值,因此您需要創建所謂的「閉包」以獲取狀態(result.data。 url)從函數(結果)調用到父範圍內(在這種情況下,由函數($ 1)創建的範圍)。閉包會變得非常混亂,特別是在javascript中,有時會產生非顯而易見的結果。謝天謝地,這是一個簡單的關閉。多一點信息,你可以結帳這https://stackoverflow.com/q/7363168/4572,或谷歌。

這是正常工作對我來說代碼:

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; 
}; 
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); 
}; 
+0

我喜歡這種方法,除了它將所有的字符串替換成不重要的鏈接,而不僅僅是url 。 –

+0

對不起,我誤解了代碼。你應該在字符串中找到所有的url,然後將它們減少到唯一的url。然後,您應該發出請求以縮短每個網址並存儲結果,一旦完成所有請求,您將需要使用縮短的網址調用回調來替換全部網址。添加一個賞金,我一定會爲你今天的代碼:) –

+0

對不起芽。我的一位朋友在這張照片上看着我!儘管如此,謝謝你的努力。顯然我有很多要學習JavaScript! –