2014-09-02 5 views
-1

В настоящее время с помощью этого:Regex заменить url в тексте?

MatchCollection urlRegExp = Regex.Matches(text, @"https?://(?:www\.)?[a-zA-Z0-9/;&=:_$+!*'()|~\[\]#%.\\-]+"); 

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

+2

Возможный дубликат [Что является лучшим регулярным выражением, чтобы проверить, является ли строка допустимым URL?] (Http://stackoverflow.com/questions/161738/what-is-the-best-regular-expression-to -check-if-a-string-is-a-valid-url) –

+0

какую платформу вы используете? – Steve

+0

@ PM77-1: Он/она не пытается проверить, является ли URL-адрес действительным или нет, но только для поиска URL-адресов в тексте, это две совершенно разные задачи. –

ответ

1

Если вам нужно найти URL-адреса в тексте, вам не нужно соответствовать RFC (независимо от числа), это абсолютно бесполезно (и это почти невозможно с шаблоном, который следует стандарту, он будет слишком медленным, слишком сложный).

Все URL-адреса в тексте считаются действительными (и/или должны быть подтверждены или нет, прежде чем вставляться в текст людьми, производящими этот текст. Иными словами, это не ваша работа!).

Итак, вы должны найти другой подход. Чтобы сделать это, вы должны задать правильный вопрос: как отличить URL от текста?

Перечислим общие критерии

  • URL-адрес может начинаться с протокола: HTTP, HTTPS, FTP, SFTP, FTPS, суслик, ...
  • URL-адрес может начинаться с www.
  • URL-адрес не содержит пробельных символов
  • URL-адрес начинается всегда с границы слова
  • URL-адрес может заканчиваться перед символом пробела, концом строки, символом пунктуации, за исключением вопроса знак (который может присутствовать, даже если нет никаких параметров GET)

С этими требованиями, вы можете построить легко наивный шаблон для протокола HTTP:

\b(https?://|www\.)\S+(?=\s|[^\P{P}?]|\z) 

Обратите внимание, что, как только вы получите В результате вы можете проверить правильность URL-адреса с помощью встроенной функции (что обычно не обрабатывает все случаи, но теперь вы знаете, почему :).

+0

Да, но будет ли он работать с URL-адресами, о которых я не знаю, если URL-адрес выглядит примерно так: testone123.me или что-то подобное .. – user3352374

+0

@ user3352374: Наверное, но нет никакого способа узнать, «testone123.me "является доменным именем (и расширением URL) или простым текстовым элементом. Если вы создаете, например, шаблон для обнаружения этого: '\ b \ w + \. \ W +', все подстроки, которые выглядят так, будут сопоставлены, и вы получите ложноположительные результаты. (представьте, что кто-то забудет пробел после точки: «У Боба есть cat.me, у меня есть собака». –

+0

Да, но бы ваш код, который вы только что дали мне, обнаружил URL-адрес facebook или что-то в этом роде? Что относительно test123. me/fsifi8e3393?: O – user3352374

Смежные вопросы