2009-11-22 2 views
1

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

Вот следующие тестовые ссылки:

http://www.a-domain.com/something/?something 
www.a-domain.com/something/?something 

Регулярное выражение должно также работать при следующих предположениях:

Anything присоединенной к URL, который не является частью URL (запятая или период, например) следует игнорировать. Я нашел this one, но это не соответствует всем моим потребностям.

У кого-нибудь есть правильное регулярное выражение для моих нужд?

ответ

3

В this blog post, гуру Regex Jan Goyvaerts показывает несколько способов, как согласовать URL-адреса в виде простого текста. Он также показывает много распространенных ловушек.

В вашем случае я бы рекомендовал

\b(?:(?:https?|ftp|file)://|www\.|ftp\.)[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$] 

(режим регистронезависимым включен)

+0

Спасибо :) Кажется, он делает несколько лучших матчей. –

+0

Хм, 'mailto:' отсутствует. И некоторые другие приятные вещи, такие как 'gopher:' (jk, хотя :-)). – Joey

+1

Я знаю; см. ссылку выше для версии, которая также содержит 'mailto:' (и может быть расширена для 'gopher:', если вам нравится :)) –

0
(http://|www\.)([^\s()[\]<>]+|\([^\s)]*\)|\[[^\s\]]*])+(?<![.,!?]) 

Это обрабатывает большинство случаев, но не пытается обрабатывать все. (Он использует отрицательное утверждение lookbehind в конце, я не знаю, могут ли ваши библиотеки регулярных выражений C# или asp.net обрабатывать это, но это простой способ сделать это «не жадным» для этих символов в конце.)

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

+0

На самом деле я думаю, что будет делать :) http://regexlib.com/RETester.aspx является очень хороший тестер, который может протестировать .Net, JavaScript, VBScript. Однако я замечаю, что http: // или www. находится в $ 1, а остальная часть (www.something.com или something.com) находится в $ 2, которая, как мне кажется, потребует от меня проверить, есть ли еще http: //, перед тем как сделать текст ссылки. –

+0

Да, я только структурировал группы для сопоставления здесь, полагая, что вы можете приспособить их по мере необходимости, и ваши знакомые регулярные выражения позволяют. Я просто извлечу полное совпадение и добавлю 'http: //', если его там нет, предоставив вам последовательную форму для работы после этого. – 2009-11-22 23:02:40

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