Как найти ссылки HTTP в почте HTML, используя регулярные выражения в JavaScript - PullRequest
0 голосов
/ 03 августа 2010

Я работаю над почтовым клиентским приложением. Я хочу, чтобы все ссылки HTTP были активными гиперссылками.

Я заметил, что некоторые клиенты отправляют ссылки HTTP, не заключая их в теги привязки. В этом случае я не могу показать эти ссылки в виде кликабельных ссылок.

Мое требование состоит в том, чтобы найти все ссылки HTTP в письме HTML, и мне необходимо заменить эти ссылки, заключив их в теги привязки, а также мне нужно исключить ссылки, которые уже находятся в тегах привязки или в атрибуте источника любого тега. 1005 *

Пример: предположим, что в моем письме 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 ... потому что он также может быть источником любого тега.

Так может ли кто-нибудь помочь мне решить эту проблему

Заранее спасибо

Субби

Ответы [ 3 ]

2 голосов
/ 03 августа 2010

Я считаю, что вы не можете сделать это правильно за одно регулярное выражение; а также обязательная ссылка . Зачем вам делать это с помощью регулярных выражений, если вы работаете в JavaScript? Ваш переводчик упакован вместе с архетипическим механизмом синтаксического анализа HTML: веб-браузером. Просто погрузитесь в DOM и замените текстовые узлы.

Если вы не делаете это в JS, а тег просто вводит в заблуждение, и вы не можете найти приличную библиотеку для разбора HTML, тогда лучше всего разделить строку по тегам, заменить на элементы, не являющиеся тегами затем присоединяйтесь, я думаю.

0 голосов
/ 04 августа 2010

Я только что проверил это выражение:

/\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

0 голосов
/ 04 августа 2010

Проверьте это:

(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);

Дайте мне знать, что это решит вашу проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...