【问题标题】:JavaScript replacing text with function result for each match in textJavaScript 用函数结果替换文本中每个匹配的文本
【发布时间】:2011-04-18 21:09:43
【问题描述】:

我正在尝试将 textarea 元素中的所有链接替换为该段文本的函数结果。

例子:

url = /(^||$)/g; Text = "www.stackoverflow.com 内带有链接的文本"; text.replace(网址,转换(结果)); document.write(文本); 函数转换(链接){ 返回“XX”+链接+“XX”; }

我需要的是,在该字符串中找到的每个链接都被转换为被 XX 或任何其他字符串包围。 事实上,我需要将文本中的每个链接发送到该函数,因此我可以替换它们中的每一个。

我已经在网上搜索了几个小时。尝试了很多东西。没有任何效果。

关于如何做到这一点的任何想法?

提前致谢!

【问题讨论】:

    标签: javascript replace


    【解决方案1】:

    有一些问题。

    1. replace 函数允许引用函数作为其第二个参数。您正在调用convert 函数,而不是传递引用。
    2. replace 函数不会修改原始字符串。您需要保存其结果。
    3. 您正在尝试使用未定义的convert

    把它们放在一起:

    function convert(link) {
        return " XX " + link + "XX";
    }
    var url = /(^|<|\s)(www\..+?\..+?)(\s|>|$)/g;
    var text = "Text with link inside www.stackoverflow.com";
    text = text.replace(url, convert);
    

    输出:

    "Text with link inside XX www.stackoverflow.comXX"
    

    【讨论】:

    • 对!有用。但是如何替换文本中的所有 URL?假设现在的文本是:“这是一个链接 www.stackoverflow.com.br,这是另一个链接 www.google.com”。它只替换第一个链接。
    • @Rafael - 你确定吗?对我来说适用于多个链接。
    • 好的,它确实有效,但现在我遇到了另一个问题。将链接执行器重写为 GET 请求的函数。当我调用该函数时,它会重写为“未定义”。我认为它在函数捕获请求结果之前重写。整个函数如下。
    • @Rafael - 对,您的convert 函数被传递给replace,但随后它启动了一个异步执行的Ajax 请求。到请求的回调执行时,replace 将完成。
    • 所以......几个小时后,我明白了。这是我的完整功能:pastebin.ca/2048378 任何改进,请告诉我。谢谢!
    【解决方案2】:

    String#replace 不会修改接收者,因为 JavaScript 中的字符串是不可变的。你想要这个:

    url = /(^|<|\s)(www\..+?\..+?)(\s|>|$)/g;
    text = "Text with link inside www.stackoverflow.com";
    text = text.replace(url, convert(RESULT));
    document.write(text);
    
    function convert(link){
      return " XX " + link + "XX";
    }
    

    另外,您引用了Text 而不是text,我已更正。

    【讨论】:

    • 谢谢布赖恩,我写错了,但这不是问题。
    猜你喜欢
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    相关资源
    最近更新 更多