Регулярное выражение для поиска URL-адресов в блоке текста (Javascript) - PullRequest
2 голосов
/ 18 ноября 2009

Мне нужно регулярное выражение Javascript, которое сканирует блок простого текста и возвращает текст с URL-адресами в виде ссылок.

Вот что у меня есть:

findLinks: function(s) {
          var hlink = /\s(ht|f)tp:\/\/([^ \,\;\:\!\)\(\"\'\\f\n\r\t\v])+/g;
          return (s.replace(hlink, function($0, $1, $2) {
              s = $0.substring(1, $0.length);
              while (s.length > 0 && s.charAt(s.length - 1) == '.') s = s.substring(0, s.length - 1);

              return ' ' + s + '';
          }));
      }

проблема в том, что он будет соответствовать только http://www.google.com а НЕ google.com / adsense

Как я мог достичь обоих?

Ответы [ 4 ]

6 голосов
/ 18 ноября 2009

Я использую это как ссылку все время. У этого парня 8 регулярных выражений, которые вы должны знать.

http://net.tutsplus.com/tutorials/other/8-regular-expressions-you-should-know/

Вот что он использует для поиска URL

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ 

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

3 голосов
/ 18 ноября 2009

Это нетривиальное задание. Чтобы сопоставить любой URI, который является действительным в соответствии с соответствующими RFC, вам необходимо монументально сложное регулярное выражение, и даже тогда оно не будет отфильтровывать URI с недопустимыми доменами верхнего уровня (например, http://brussels.sprout/).. Таким образом, вы должны пойти на компромисс Определите, что для вас важно (примеры: являются ли ложные срабатывания или ложные отрицания более приемлемыми? Хотите ли вы ограничить домены верхнего уровня только теми, которые существуют в настоящее время? Разрешаете ли вы использовать нелатинские символы в соответствующих URI?). Вы нуждаетесь в регулярном выражении, чтобы делать и оформлять его соответствующим образом, а не слепо копировать и вставлять пример из Интернета.

2 голосов
/ 18 ноября 2009

Вы можете сделать часть протокола необязательной:

/\s((ht|f)tp:\/\/)?([^ \,\;\:\!\)\(\"\'\\f\n\r\t\v])+/g

0 голосов
/ 18 ноября 2009

Попробуйте это (работает с вашим примером текста)

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