纯文本中识别URI地址并转换成HTML

问题

有一段纯文本text, 欲将其插入DOM节点div中. text中可能有超链接, 邮件地址等. 如果有, 识别之.

分析

  1. 如果只是纯文本, 插入div中, 只要将div.innerText设置为text即可.
  2. text中的URI地址可以用正则识别, 并将其替换为<a/>标签组成的字符串. 此时 text变成了HTML字符串html.
  3. HTML字符串html可以赋值给div.innerHTML. 但如果原text中存在HTML语义的 字符串呢? 因此, 在识别URI之前, 需要将原text作转义.

解决

uri-recognition.js

(function () {
    var trim = function (s) {
        /*jslint eqeq:true*/
        if (s == null || s === ‘‘) {
            return ‘‘;
        }
        // s 空格
        // 	 制表符
        // xA0 non-breaking spaces
        // 3000中文空格
        return String(s).replace(/^[s	xA03000]+/, ‘‘).
            replace(/[s	xA03000]+$/, ‘‘);
    },
    startsWith = function (s, sub) {
        s = String(s);
        return s.indexOf(sub) === 0;
    },
    test = function (str) {
        /*jslint maxlen: 100*/
        var URI_REG = /(https?://|www.|ssh://|ftp://)[a-z0-9&_+-?/.=#]+/i,
            MAIL_REG = /[a-z0-9_+-.][email protected][a-z0-9_+-.]+/i;
        str = trim(String(str));
        return URI_REG.test(str) || MAIL_REG.test(str) || false;
    },
    /**
     * @param {String} str
     * @param {Function} replacer
     */
    replace = function (str, replacer) {
        /*jslint maxlen: 100*/
        var URI_REG = /(https?://|www.|ssh://|ftp://)[a-z0-9&_+-?/.=#]+/gi,
            MAIL_REG = /[a-z0-9_+-.][email protected][a-z0-9_+-.]+/gi;

        str = trim(String(str));

        str = str.replace(URI_REG, function (match) {
            var newStr =  replacer({
                mail: false,
                fullURI: startsWith(match.toLowerCase(), ‘www.‘) ?
                        (‘http://‘ + match) : match,
                match: match
            });
            /*jslint eqeq: true*/
            return newStr == null ? match : newStr;
        });
        str = str.replace(MAIL_REG, function (match) {
            var newStr =  replacer({
                mail: true,
                fullURI: ‘mailto:‘ + match,
                match: match
            });
            /*jslint eqeq: true*/
            return newStr == null ? match : newStr;
        });
        return str;
    },
    uriRecognition = function (text) {
        var doc = document,
            html;
        text = trim(String(text));
        if (test(text)) {
            //use {} to escape
            text = text.replace(/{<}/g, ‘{{<}}‘).
                replace(/{>}/g, ‘{{>}}‘).
                replace(/</g, ‘{<}‘).
                replace(/>/g, ‘{>}‘);

            html = replace(text, function (info) {
                if (!info || !info.match || !info.fullURI) {
                    return null;
                }
                var link = doc.createElement(‘a‘);
                link.setAttribute(‘href‘, info.fullURI);
                /*jslint eqeq: true*/
                if (link.innerText != null) {
                    link.innerText = info.match;
                } else if (link.textContent != null) {
                    link.textContent = info.match;
                }
                return link.outerHTML;
            });

            html = html.replace(/{<}/g, ‘<‘).
                replace(/{>}/g, ‘>‘);

            return {
                content: html,
                isPlainText: false
            };
        }
        return {
            content: text,
            isPlainText: true
        };
    },
    setContentWithURIRecognition = function (el, text) {
        var result = uriRecognition(text);
        if (!result) {
            return;
        }
        if (result.isPlainText) {
            if (el.innerText != null) {
                el.innerText = result.content;
            } else if (el.textContent != null) {
                el.textContent = result.content;
            }
        } else {
            el.innerHTML = result.content;
        }
    };
    window.uriRecognition = uriRecognition;
    window.setContentWithURIRecognition = setContentWithURIRecognition;

})();

test.html

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
        <title>uri regcognition</title>
    </head>
    <body>
        <script src="./uri-recognition.js" type="text/javascript"></script>
        <script type="text/javascript">
            var text = ‘<a href="http://china.haiwainet.cn/n/2014/0509/c232587-20619235.html" ‘ +
                    ‘mon="ct=1&a=2&c=top&pn=8" target="_blank">‘ +
                    ‘纽约时报:阿里巴巴IPO将风险推向全新水平</a>‘ +
                    ‘ send to [email protected] xxxx‘,
                div = document.createElement(‘div‘);

            window.setContentWithURIRecognition(div, text);
            document.body.appendChild(div);
        </script>
    </body>
</html>

Chrome下测试OK.

纯文本中识别URI地址并转换成HTML,布布扣,bubuko.com

时间: 2024-10-12 12:44:03

纯文本中识别URI地址并转换成HTML的相关文章

Linux Shell编程实战---解析文本中的邮件地址和url

解析文本中的邮件地址和url (1).使用场景 从给定的文件中解析出所需要的文本是从事文本处理时常见的一项任务.诸如电子邮件地址.URL等都能够借助适合的正则表达式找出来.我们通常需要从一个包含大量无关字符及单词的电子邮件客户列表或HTML网页中将电子邮件地址解析并提取出来. (2).正则匹配 匹配一个电子邮件地址的正则表达式如下: [A-Za-z0-9._][email protected][A-Za-z0-9.]+\.[a-zA-Z]{2,4} 匹配HTTP URL的正则表达式如下: htt

将传入结构体 pMtInfo 中包含的数据内容转换成 JSON 字符串返回

upu_struct.h封装了有关  pMtInfo结构体的内容,用到的部分如下图所示: 利用jansson库实现将传入结构体 pMtInfo 中包含的数据内容转换成 JSON 字符串返回 代码如下: #include <stdio.h> #include <string.h> #include "jansson.h" #include "upu_struct.h" #include "upu_proto_parse.h"

C#将image中的显示的图片转换成二进制

原文:C#将image中的显示的图片转换成二进制 1.将Image图像文件存入到数据库中 我们知道数据库里的Image类型的数据是"二进制数据",因此必须将图像文件转换成字节数组才能存入数据库中. //将本地图片转换成二进制保存起来 private byte[] SetImageToByteArray(string fileName) { FileStream fs = null; try { fs = new FileStream(fileName, FileMode.Open, S

CAD编辑中可以把CAD图纸转换成JPG图片格式吗?

CAD编辑中可以把CAD图纸转换成jpg格式的图片吗?一般小伙伴们可能知道的是在CAD编辑器中绘制CAD图纸,如果需要转换CAD图纸格式的话,一般都是借助CAD转换器来进行转换的,那么如何在CAD编辑器中转换图纸格式呢?CAD编辑器中可以把CAD图纸转换成JPG图纸格式吗?具体要怎么来进行操作?那下面小编就来教教大家具体操作方法,小伙伴们可以学习一下. 第一步:首先,打开电脑,在电脑桌面上任意的打开一个浏览器,在浏览器的搜索框中搜索迅捷CAD编辑器(标准版),然后在搜索的结果中,点击官网进行,根

工作中的wps文件怎么转换成pdf

工作中的wps文件怎么转换成pdf?wps是一款功能齐全,且操作简单易学的文件编辑工具.现如今职场当中,大部分的职员都选择使用wps完成每天的工作任务.可是wps文件也是有着自己的缺陷,就是wps制作出来的文件安全性较低.可轻而易举得通过复制粘贴等方式,将其文件内容挪用.所以大家都会将使用wps制作好的文件,转换为pdf格式再进行保存.下面的文字内容里小编就将和大家说说如何将工作当中的wps文件转换为pdf格式. 1.一般来说大家都是在wps中,通过另存为的方式来改变文件格式.可是这种操作方法,

ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)

原文:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100) 对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是以经纬度为单位的都是地理坐标系,因为它归根结底是一个椭球体,只不过各个国家为了反映该国家所在区域地球的真实形状,而采用不同的数学模型对本不是椭球体的地球进行椭球体化.而投影坐标系,是对地理坐标系按照某种方式投影到平面上的,所以可以认为它是一个平面坐标系,单位自然是米或千米. 我们在做开发的时候,尤其

ORACLE 中NUMBER 类型 低精度转换成高精度

例如: 表User中有一个字段 salary  Number(10,3), 如果想把字段salary的类型提高精度到salary  Number(10,6),保留六位小数, 解决办法:1,ALTER TABEL USER MODIFY SALARY NUMBER(13,6); 解释:number类型刚开始是,长度10位,3位小数,如果想增加3位小数,对应的长度也必须增加,否则无法修改.所以NUMBER(13,6);这样就可以提高精度了, ORACLE 中NUMBER 类型 低精度转换成高精度

参数强制转换还是将参数的地址强制转换成线程参数

第一种方式:将传递的值,强制转换值的地址,然后在线程函数中,首先强制转换参数的类型,然后取值 DWORD WINAPI ThreadProc(LPVOID lpParam){ int i=(*(int*)lpParam);   //get the parameter from CreateThread function CreateThread(NULL,            NULL,      ThreadProc,      (LPVOID)i,**********      0,   

Java中Office(word/ppt/excel)转换成HTML实现

运行条件:JDK + jacob.jar + jacob.dll 1) 把jacob.dll在 JAVA_HOME\bin\ 和 JAVA_HOME\jre\bin\ 以及C:\WINDOWS\system32\目录下各放一份 2) 把jacob.jar放入 项目的lib包下,并且在“java构建路径”中也要加载此jar包. 3) 运行项目即可编译通过. 注:jacob.jar以及jacob.dll版本要和jdk版本相匹配,否则可能出现异常! import com.jacob.activeX.A