如何在JavaScript中使用正则表达式查找HTML邮件中的HTTP链接

如何在JavaScript中使用正则表达式查找HTML邮件中的HTTP链接,javascript,html,regex,parsing,Javascript,Html,Regex,Parsing,我正在开发邮件客户端应用程序。我想将所有HTTP链接显示为可单击的超链接 我注意到一些客户端发送HTTP链接时没有将它们封装在锚标记中。在这种情况下,我无法将这些链接显示为可单击的链接 我的要求是找到HTML邮件中的所有HTTP链接,并需要通过将它们封装在锚定标记中来替换这些链接,同时我还需要排除锚定标记或任何标记的源属性中已经存在的链接 假设我的HTML邮件包含以下文本 Input: "http://www.google.com/" < a href = "http:\\gma

我正在开发邮件客户端应用程序。我想将所有HTTP链接显示为可单击的超链接

我注意到一些客户端发送HTTP链接时没有将它们封装在锚标记中。在这种情况下,我无法将这些链接显示为可单击的链接

我的要求是找到HTML邮件中的所有HTTP链接,并需要通过将它们封装在锚定标记中来替换这些链接,同时我还需要排除锚定标记或任何标记的源属性中已经存在的链接

假设我的HTML邮件包含以下文本

Input:  "http://www.google.com/"     < a href = "http:\\gmail.com"></a>
输入:http://www.google.com/“
更换后,我想把下面的

Output: <a href = "http://www.google.com"> </a> < a href = "http:\\gmail.com"></a>
Output:
我想我不能直接寻找以http开始的模式。。。因为它也可以作为任何标记的src

有人能帮我解决这些问题吗

提前谢谢


Subbi

我相信你不能在一个regexp中正确地完成它;而且,。如果您使用的是JavaScript,为什么您热衷于使用regexp呢?解释器与原型HTML解析引擎(web浏览器)一起装箱。只需深入研究DOM并替换文本节点

如果您没有在JS中执行此操作,并且标记只是误导性的,并且您找不到合适的HTML解析库,那么您的最佳选择是按标记拆分字符串,替换非标记元素,然后重新连接。我认为。

检查此项:

(function($){ $.fn.hyperlinkRegex = function(regex, target, ismailto) { ismailto = ismailto || false; if(regex == undefined || regex.source == '') { $(this).find('a').each(function(){ $(this).replaceWith($(this).text()); $(this).parent().each(function(){ node = $(this).get(0); if(node.normalize) node.normalize(); }); }); } else { $(this).each(function(){ elt = $(this).get(0) elt.normalize(); $.each($.makeArray(elt.childNodes), function(i, node){ if(node.nodeType == 3) { var searchnode = node while((pos = searchnode.data.search(regex)) >= 0) { match = searchnode.data.slice(pos).match(regex)[0]; if(match.length == 0) break; var anode = document.createElement('a'); var middlebit = searchnode.splitText(pos); var searchnode = middlebit.splitText(match.length); var middleclone = middlebit.cloneNode(true); anode.appendChild(middleclone); if (ismailto == true) { anode.href = "mailto:" + middleclone.nodeValue; } else { anode.href = middleclone.nodeValue; } anode.target = target; searchnode.parentNode.replaceChild(anode, middlebit); } } else { $(node).hyperlinkRegex(regex, target, ismailto); } }) }) } return $(this); } })(jQuery); (函数($){ $.fn.hyperlinkRegex=函数(regex、target、ismailto){ 伊斯梅托=伊斯梅托| |假; if(regex==未定义| | regex.source==''){ $(this).find('a').each(function(){ $(this.replace为($(this.text()); $(this).parent().each(function()){ node=$(this.get)(0); if(node.normalize)node.normalize(); }); }); }否则{ $(this).each(function(){ elt=$(此).get(0) elt.normalize(); $.each($.makeArray(elt.childNodes),函数(i,节点){ if(node.nodeType==3){ var searchnode=node 而((pos=searchnode.data.search(regex))>=0){ match=searchnode.data.slice(pos.match(regex)[0]; 如果(match.length==0)中断; var=document.createElement('a'); var middlebit=searchnode.splitText(pos); var searchnode=middlebit.splitText(match.length); var middleclone=middlebit.cloneNode(true); 阳极。追加子体(middleclone); 如果(ismailto==true){ anode.href=“mailto:”+middleclone.nodeValue; }否则{ anode.href=middleclone.nodeValue; } 阳极。目标=目标; searchnode.parentNode.replaceChild(阳极,中间位); } }否则{ $(节点).hyperlinkRegex(regex,target,ismailto); } }) }) } 返回美元(此); } })(jQuery); 用法:

// basic links var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; node.hyperlinkRegex(exp, "_blank", false); // email exp = /(\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)/ig; node.hyperlinkRegex(exp, "_blank", true); //基本链接 var exp=/(\b(https?| ftp |文件):\/\/[-A-Z0-9+&@#\/%?=~~|!:,.;]*[-A-Z0-9+&@#\/%=~|]/ig; node.hyperlinkRegex(exp,“_blank”,false); //电子邮件 exp=/(\b[A-Z0-9.\uz0%-]+@[A-Z0-9.-]+\[A-Z]{2,4}\b)/ig; node.hyperlinkRegex(exp,“_blank”,true); 让我知道这解决了你的问题
我刚刚测试了这个表达式:

/\s+("http:[^\s]+")\s+/g 
这将替换由空格括起的每个引用URL。您可以这样使用它:

var string = "\"http://www.google.com/\"     < a href = \"http:\\gmail.com\"></a>" ; //!! the email string you provided
var replaced = string.replace(/\s+("http:[^\s]+")\s+/g," <a href=$1></a> ") ;
var string=“\”http://www.google.com/\“”;/!!您提供的电子邮件字符串
var replaced=string.replace(/\s+(“http:[^\s]+”)\s+/g“”);
除此之外,javascript不支持regex中的(负)查找,这需要完全识别匹配的URL是否在html标记中

嗯,


FK

此邮件客户端应用程序基于和/或编写的确切技术是什么?我还添加了regex标记——因为这是问题的一部分,但是regex将不是一个非常健壮的解决方案。
http:\\gmail.com
是一个无效的地址。协议名称后面跟着
'/'
。浏览器可能会接受它并在内部进行修改,但
curl
不会:)看看这篇文章:这个链接太棒了:“连Jon Skeet都不能用正则表达式解析HTML。”:D