JavaScript Regexp, чтобы обернуть URL и электронные письма в якорях - PullRequest
3 голосов
/ 24 февраля 2009

Я искал все выше и ниже, но не могу найти точного ответа на этот вопрос. Как это часто бывает с регулярными выражениями. Поэтому я решил спросить здесь.

Я пытаюсь собрать регулярное выражение, которое я могу использовать в JavaScript, чтобы заменить все экземпляры URL-адресов и адресов электронной почты (не нужно быть очень строгими) тегами привязки, указывающими на них.

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

Единственная проблема, как я уже говорил, в моем наборе навыков - огромная дыра в форме регулярного выражения: (

Я знаю, что у одного из вас есть ответ на кончике ваших пальцев:)

Ответы [ 5 ]

5 голосов
/ 24 февраля 2009

Ну, вслепую, используя регулярные выражения из http://www.osix.net/modules/article/?id=586

var emailRegex = 
   new RegExp(
   '([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}' + 
   '\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.' + 
   ')+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)',
   "gi");

var urlRegex = 
   new RegExp(
   '((https?://)' + 
   '?(([0-9a-z_!~*\'().&=+$%-]+: )?[0-9a-z_!~*\'().&=+$%-]+@)?' + //user@ 
   '(([0-9]{1,3}\.){3}[0-9]{1,3}' + // IP- 199.194.52.184 
   '|' + // allows either IP or domain 
   '([0-9a-z_!~*\'()-]+\.)*' + // tertiary domain(s)- www. 
   '([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.' + // second level domain 
   '[a-z]{2,6})' + // first level domain- .com or .museum 
   '(:[0-9]{1,4})?' + // port number- :80 
   '((/?)|' + // a slash isn't required if there is no file name 
   '(/[0-9a-z_!~*\'().;?:@&=+$,%#-]+)+/?))',
   "gi");

тогда

text.replace(emailRegex, "<a href='mailto::$1'>$1</a>");

и

text.replace(urlRegex, "<a href='$1'>$1</a>");

может работать

1 голос
/ 24 февраля 2009

Вот хорошая статья для URL ...

https://blog.codinghorror.com/the-problem-with-urls/

электронные письма более просты, так как они должны заканчиваться на .tld Тебе не нужно увлекаться этим, потому что ты не проверяешь, просто сопоставляешь, так что мне в голову ...

[^ \ s] + @ \ ш [\ ш -.]. * [A-Za-Z] +

1 голос
/ 24 февраля 2009

Не консервированное решение, но это укажет вам правильное направление.

Я использую Regex Coach для создания и тестирования моих регулярных выражений. Вы можете найти множество примеров регулярных выражений для URL-адресов и адресов электронной почты в Интернете.

0 голосов
/ 26 февраля 2009

Просто добавив немного информации о регулярных выражениях в электронной почте: большинство из них, похоже, игнорируют, что в именах доменов могут быть символы «åäö». Поэтому, если вы заботитесь об этом, убедитесь, что в используемом вами решении есть åäöÅÄÖ в доменной части регулярного выражения.

0 голосов
/ 24 февраля 2009

Как всегда, это ("this", являющееся "обработкой HTML с помощью регулярных выражений") будет трудным и подверженным ошибкам. Следующее будет работать только на разумно правильно сформированном вводе, но вот что я бы сделал:

  1. найдите элемент, который вы хотите обработать, примите его innerHTML значение свойства
  2. итеративно находит все, что уже является ссылкой (/(<a\b.+?</a>/ig)
  3. основываясь на этом, обрежьте вашу строку в биты «это не ссылка» и «это ссылка», добавив их все в аккуратно упорядоченный массив
  4. обрабатывает только биты без ссылок (те, которые не начинаются с "<a "), в поисках шаблонов URL-адресов или адресов электронной почты
  5. Оберните каждый адрес, который вы найдете в <a> тегах
  6. join() массив обратно в строку
  7. установите для свойства innerHTML новое значение

Я уверен, что вы найдете примеры регулярных выражений, которые соответствуют адресам электронной почты и URL-адресам. Возьмите те, которые вам больше всего подходят, и используйте их на шаге 4.).

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