如何用链接替换普通 URL,例如? [复制]

2024-02-23

我几乎已经成功了。我想知道是否有much更好的方法。

根本问题 https://stackoverflow.com/q/37684/1153319

Fiddle http://jsfiddle.net/5cr6K/

function replaceURLWithHTMLLinks(text) {
    text = text.replace(/a/g, "--ucsps--");
    text = text.replace(/b/g, "--uspds--");
    var arrRegex = [
        /(\([^)]*\b)((?:https?|ftp|file):\/\/[-A-Za-z0-9+&@#\/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#\/%=~_()|])(\))/ig,
        /(\([^)]*\b)((?:https?|ftp|file):\/\/[-A-Za-z0-9+&@#\/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#\/%=~_()|])(.?\b)/ig,
        /()(\b(?:https?|ftp|file):\/\/[-a-z0-9+&@#\/%?=~_()|!:,.;]*[-a-z0-9+&@#\/%=~_()|])(.?\b)/ig];
    for (i = 0; i < arrRegex.length; i++) {
        text = text.replace(arrRegex[i], "$1a$2b$3");
    }
    text = text.replace(/a([^b]*)b/g, "<a href='$1'>$1</a>");
    text = text.replace(/--ucsps--/g, "a");
    text = text.replace(/--uspds--/g, "b");
    return text;
}
var elm = document.getElementById('trythis');
elm.innerHTML = replaceURLWithHTMLLinks(elm.innerHTML);

有什么想法吗?


Over at 代码审查 https://codereview.stackexchange.com/a/33425/31375这个问题得到了很好的回答出色地 http://jsfiddle.net/EwzcD/1/.

function replaceURLWithHTMLLinks(text) {
    var re = /(\(.*?)?\b((?:https?|ftp|file):\/\/[-a-z0-9+&@#\/%?=~_()|!:,.;]*[-a-z0-9+&@#\/%=~_()|])/ig;
    return text.replace(re, function(match, lParens, url) {
        var rParens = '';
        lParens = lParens || '';

        // Try to strip the same number of right parens from url
        // as there are left parens.  Here, lParenCounter must be
        // a RegExp object.  You cannot use a literal
        //     while (/\(/g.exec(lParens)) { ... }
        // because an object is needed to store the lastIndex state.
        var lParenCounter = /\(/g;
        while (lParenCounter.exec(lParens)) {
            var m;
            // We want m[1] to be greedy, unless a period precedes the
            // right parenthesis.  These tests cannot be simplified as
            //     /(.*)(\.?\).*)/.exec(url)
            // because if (.*) is greedy then \.? never gets a chance.
            if (m = /(.*)(\.\).*)/.exec(url) ||
                    /(.*)(\).*)/.exec(url)) {
                url = m[1];
                rParens = m[2] + rParens;
            }
        }
        return lParens + "<a href='" + url + "'>" + url + "</a>" + rParens;
    });
}

注意:我在“var re”中的“@”符号有错误 - 我只是将其替换为@@

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用链接替换普通 URL,例如? [复制] 的相关文章

随机推荐

  • Google AppInvites 中断构建

    您的应用程序的一部分build gradle这是 tasks withType com android build gradle tasks PackageApplication pkgTask gt pkgTask jniFolders
  • 如何在v-html中运行脚本

    我从数据库获取嵌入代码 Instagram Twitter 等 如何将它们绑定到 vue 组件 有没有办法在v html中执行脚本标签 简短的回答 你不能 一旦 dom 加载 您的浏览器就会阻止脚本标签的执行 长答案 您可以尝试匹配脚本的
  • 如何保留对 NPM 模块所做的本地更改?

    我已经使用 NPM 拉下了一个节点模块 并将其添加到package json 然而 需要更改模块的一些代码 因为它没有 100 满足我的要求 通常当我使用节点时git我会忽略node modules目录及使用npm install部署到服务
  • CSS - 并排的内联块,宽度为 100%

    我有两个带有文本的块 文本的长度不是恒定的 用户输入 左侧块中包含短文本 但右侧块可能包含非常长的文本 这些块应该并排出现 并且分布在父级恒定宽度的 100 上 不多也不少 简化示例 https jsfiddle net hh6a03cy
  • 在恒定空间和线性时间内向后打印单链表

    我听到一个面试问题 向后打印单链表 在恒定空间和线性时间中 我的解决方案是反转链接列表 然后像这样打印它 还有其他非破坏性的解决方案吗 您已经找到了大部分答案 将链表反转到位 然后将列表遍历回开头以打印它 为了防止它 永久 破坏性 请就地反
  • AtomicBoolean 与同步块

    我试图通过替换一些来减少代码中的线程争用synchronized块与AtomicBoolean 这是一个例子synchronized public void toggleCondition synchronized this mutex i
  • Subversion 和 CVS 中添加自动内容的标签怎么称呼?

    像 log and version 在签入文件时添加数据 我有兴趣查看其他人以及他们可以提供哪些信息 但除非我知道他们叫什么 否则我无法获得太多信息 Subversion 和 CVS 都称它们为Keywords 在这里查看 SVN 手册 h
  • 窗口函数过滤当前行

    这是后续this https stackoverflow com questions 48000013 optimize slow aggregates in lateral join问题 我的查询被改进为使用窗口函数而不是内部的聚合LAT
  • 你如何制作一个makefile

    我想知道如何为 Unix 创建 makefile 这里有一个好的生成文件教程 http oucsace cs ohiou edu bhumphre makefile html 搜索 如何创建 makefile 后 Google 上的第一个结
  • 修复 Chocolatey“访问被拒绝”的问题

    我刚刚第一次使用安装了 Chocolateythis https i stack imgur com fw9WX png管理员 cmd 中的命令 SystemRoot System32 WindowsPowerShell v1 0 powe
  • dlopen 中对 __dlopen 的未知引用

    dlopen位于libdl a但是当我将我的应用程序链接到libdl a gcc 链接器抛出此错误 unknow reference to dlopen called in dlopen 我应该导入另一个吗 a 当我尝试静态编译时dlope
  • C 将输入文本文件解析为单词

    我正在尝试将输入文件 包含具有多行和分隔符的文本文档 即 解析为单词 我的函数 分割函数 是 int splitInput fp int i 0 char line 255 char array 5000 int x while fgets
  • Java Lambda:迭代 2 个暗淡数组并保持当前索引

    我是 Java 8 的 Lambda 表达式的新手 我想制定以下内容 我有一个二维数组 我想在应用程序代码中对其进行多次迭代 并对数组中的项目进行处理 在我执行以下操作之前 public static abstract class BlaB
  • 将 std::bind 的结果传递给 std::function “重载”

    我有类似的问题在 C 中将不同的 lambda 传递给函数模板 https stackoverflow com questions 40523248 passing different lambdas to function templat
  • 闭包编译器对命名空间枚举发出警告

    以下示例代码生成有关高级优化的编译器警告 JSC UNSAFE NAMESPACE 为命名空间 NS 创建的不完整别名 如果我删除 enum 注释 它不会发出警告 var NS enum string NS type FOO bar NS
  • 如何在 jupyter 笔记本中使用 pandas 分析时修复此错误

    每次我在不同的数据集中使用 pandas 分析时 笔记本都会显示此错误 IndexError 仅整数 切片 省略号 numpy newaxis None 且整数或布尔数组有效 指数 import pandas as pd df pd rea
  • Webpack ProvidePlugin 与外部插件?

    我正在探索使用的想法Webpack http webpack github io with 骨干网 js http backbonejs org 我已经遵循了快速入门指南 并且对 Webpack 的工作原理有了大致的了解 但我不清楚如何加载
  • Web 服务中的例外

    我的小组正在开发一个基于服务的 NET WCF 应用程序 我们正在尝试决定如何处理内部服务中的异常 我们应该抛出异常吗 返回序列化为 XML 的异常 只返回错误码 请记住 用户永远不会看到这些异常 它仅适用于应用程序的其他部分 WCF 用途
  • 对两个表进行 SQL 查询 - 返回一个表中的行,而另一个表中没有条目

    我有两个数据库表 类别和超级类别 用于我正在开发的库存控制系统 类别 ID Category 类别名称 超级类别 ID SuperCategory 类别 ID 超级类别 ID 我将类别 子类别关系放入 SuperCategories 表中
  • 如何用链接替换普通 URL,例如? [复制]

    这个问题在这里已经有答案了 我几乎已经成功了 我想知道是否有much更好的方法 根本问题 https stackoverflow com q 37684 1153319 Fiddle http jsfiddle net 5cr6K func