我正在处理邮件客户端应用程序。我想将所有HTTP链接显示为可点击的超链接。
我注意到有些客户端正在发送HTTP链接而不将它们封装在锚标记内。在这种情况下,我无法将这些链接显示为可点击链接。
我的要求是找到HTML邮件中的所有HTTP链接,并且需要通过将它们包含在锚标记中来替换这些链接,并且我还需要排除已经在锚标记中或任何标记的source属性中的链接。 / p>
例如:假设我的HTML邮件包含以下文本
Input: "http://www.google.com/" < a href = "http:\\gmail.com"></a>
更换后我想要以下输出
Output: <a href = "http://www.google.com"> </a> < a href = "http:\\gmail.com"></a>
我想我不能直接寻找以http开头的模式...因为它也可以作为任何标签的src。
所以有人可以帮助我解决这些问题
提前致谢
物SubBi
答案 0 :(得分:2)
我相信你不能在一个正则表达式中正确地做到这一点;还有,obligatory link。如果您使用的是JavaScript,为什么还要热衷于使用regexp?您的解释器与原型HTML解析引擎一起装箱:一个Web浏览器。只需深入研究DOM并替换文本节点。
如果你没有在JS中做这个并且标签只是误导,你找不到一个像样的HTML解析库,那么你最好的办法就是用标签分割字符串,替换非标签元素,然后再加入,我想。
答案 1 :(得分:0)
检查一下:
(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);
用法:
// 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);
让我知道这可以解决您的问题
答案 2 :(得分:0)
我刚刚测试了这个表达式:
/\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> ") ;
除此之外,javascript在正则表达式中不支持(负面)lookbehind,需要完全识别匹配的URL是否在html标记内。
HTH,
FK