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

时间:2010-08-03 13:53:33

标签: javascript html regex parsing

我正在处理邮件客户端应用程序。我想将所有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

3 个答案:

答案 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