Автоматическая гиперссылка URL-адресов и электронной почты с использованием C #, при этом оставленные на месте теги на месте - PullRequest
1 голос
/ 14 июня 2010

У меня есть сайт, который позволяет пользователям публиковать сообщения на форуме.

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

Существуют инструменты, позволяющие пользователю предоставлять гиперссылки на веб-адреса и адреса электронной почты (с помощью некоторых специальных тегов / разметки) - они иногда используются, но не всегда.Кроме того, специальный тег «Изображение» также можно использовать для ссылки на изображения, размещенные в Интернете.

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

Я нашел одинили два регулярных выражения, которые преобразуют веб-адрес или адрес электронной почты в виде простой строки, однако я, очевидно, не хочу выполнять какие-либо манипуляции с адресами, которые уже обрабатываются с помощью сайтов, помеченных тегами, и вот где я застрял - как ИСКЛЮЧИТЬлюбые веб-адреса или адреса электронной почты, которые уже были обработаны с помощью специальных тегов - я не хочу оставлять их как есть.

Вот несколько примеров индивидуальных тегов для вариантов, которые мне нужно оставить в покое:

[URL=www.msn.com]www.msn.com[/URL]

[URL=http://www.msn.com]http://www.msn.com[/URL]

[EMAIL=bob@smith.com]bob@smith.com[/EMAIL]

[IMG]www.msn.com/images/test.jpg[/IMG]

[IMG]http://www.msn.com/images/test.jpg[/IMG]

Следующие примеры в идеале должны быть автоматически преобразованы в into ссылки на веб-сайт и адрес электронной почты соответственно:

www.msn.com

http://www.msn.com

bob@smith.com

В идеале к «конвертированным» ссылкам должны быть применены соответствующие теги на заказ, как в первоначальных примерах, приведенных ранее в этом посте, а не:

<a href="..." etc.

они стали бы:

[URL=http://www.. etc.)

К сожалению, у нас есть МНОГО исторических данных, хранящихся с этим специальным тегированием, поэтому сейчас мы хотели бы сохранить это, а не реализовыватьсовершенно новый способ хранения сообщений наших пользователей.

Любая помощь будет высоко ценится.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 14 июня 2010

Вот метод, который я использую.Сейчас у меня нет доступа к полной базе кода, поэтому я не вижу, как это вписывается в код форума, чтобы прекратить двойные ссылки, но попробуйте и посмотрите, работает ли он для вас ...

/// <summary>
    /// Turns any literal URL references in a block of text into ANCHOR html elements.
    /// </summary>
    public static string ActivateLinksInText(string source)
    {
        source = " " + source + " ";
        // easier to convert BR's to something more neutral for now.
        source = Regex.Replace(source, "<br>|<br />|<br/>", "\n");
        source = Regex.Replace(source, @"([\s])(www\..*?|http://.*?)([\s])", "$1<a href=\"$2\" target=\"_blank\">$2</a>$3");
        source = Regex.Replace(source, @"href=""www\.", "href=\"http://www.");
        //source = Regex.Replace(source, "\n", "<br />");
        return source.Trim();
    }
2 голосов
/ 14 июня 2010

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

http://www.regular -expressions.info / lookaround.html

Отрицательный взгляд утверждает, что за вашим шаблоном не следует что-то. Синтаксис (?!xxx), где xxx - это шаблон, определяющий то, что вы не хотите. Вы можете использовать (?!\[\/URL\]) для ссылок, например.

Негативный вид сзади выглядит как (?<!xxx). Здесь вам понадобится шаблон - что-то вроде (?<!\[URL=.*?\]) - но вы можете сделать его более устойчивым, если это необходимо.

0 голосов
/ 14 июня 2010

Регулярное выражение, которое вы ищете - (?<![EMAIL=\1])(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)(?!\[\/EMAIL]). По крайней мере, это то, что вам нужно для тега электронной почты. Ваша замена будет просто [EMAIL = $ 1] $ 1 [/ EMAIL]. Для остальных вам нужно заменить центральную группу и теги EMAIL на все, что подходит.

Контрольные примеры:

[EMAIL=bob@smith.com] bob@smith.com [/ EMAIL]: FALSE
don@smith.com: ИСТИНА

Оценивается в .NET Regex согласно вашему тегу.

0 голосов
/ 14 июня 2010

Jay прав, хотя вы также можете использовать те регулярные выражения, которые соответствуют обычным ссылкам, которые у вас есть, и просто добавить \ b в начало и конец, чтобы оно совпадало только с ссылками, которые не имеют ничего вокруг, т. Е. С вашими тегами кода форума.

\ b - это граница слова, т. Е. Пробелы, точки, запятые и т. Д. Означают, что это отдельное слово, а не часть чего-то большего.

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

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