簡體   English   中英

Javascript-使用string.replace替換文本的函數

[英]Javascript- Use function for string.replace replacement text

我試圖通過調用縮短網址的函數來替換字符串中的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始終為null。

  1. text.Replace不會改變text =>你需要說text = text.Replace(...)因為javascript中的字符串是不可變的( https://stackoverflow.com/q/51193/4572了解更多信息)

  2. getJSON是異步執行的,這意味着您要替換的函數的執行將啟動JSON調用但不等待JSON調用完成,您需要使用$ .ajax而不關閉async選項(請參閱代碼下面,以及這個鏈接: 是否可以設置async:false到$ .getJSON調用

  3. 因為JSON調用只是執行一個回調(即函數(結果)),所以它實際上並不返回一個值,所以你需要創建一個所謂的“閉包”,以便從你的內部獲取狀態(result.data.url) function(result)調用父作用域(在本例中是函數($ 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;
};

由於您調用的函數不是同步的,因此您需要某種回調函數。 以下代碼應該可以解決問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM