【问题标题】:Javascript- Use function for string.replace replacement textJavascript-使用字符串的函数。替换替换文本
【发布时间】:2011-11-23 12:54:48
【问题描述】:

我正在尝试通过调用缩短 url 然后替换文本的函数来替换字符串中的 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 由于某种原因总是为空。

【问题讨论】:

标签: javascript regex


【解决方案1】:
  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。

以下是适合我的代码:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我喜欢这种方法,除了它将所有字符串替换为位链接,而不仅仅是 url。
    • 对不起,我误解了代码。您应该找到字符串中的所有 url,然后将它们减少为唯一的。然后,您应该触发一个请求以缩短每个 url 并存储结果,一旦所有请求完成,您将需要使用缩短的 url 替换完整长度的 url 调用回调。添加赏金,我一定会在今天的某个时候为您编写代码 :)
    • 对不起,芽。我的一位朋友正在寻找我的这个!不过感谢您的努力。显然我有很多关于 javascript 的知识!
    猜你喜欢
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多