ПРИМЕЧАНИЕ : Моя проблема НЕ в том, что мои ссылки не заменяются. Но это NESTED .
например, это комментарий
some string with www.google.com/blah/blah also something else www.google.com
к моменту замены второй строки часть первой также действительна ( www.google.com / бла / бла), поэтому она заменяет эту ссылку дважды.
У меня есть веб-приложение, которое позволяет пользователям комментировать.
Я обрабатываю входную строку и преобразую все ссылки в формат ссылки html , когда отображаю ее на странице . Исходная строка ввода пользователя остается в БД и ничего не происходит, поэтому она не повреждена при обработке. Просто когда я показываю это на странице, я выполняю свою функцию на этом.
Теперь эту логику я использую, чтобы заменить все ссылки на их HTML-форматы
- Regex все ссылки
- Для каждого совпадения замените ссылку на версию в формате html в исходной строке.
- Наконец, отобразить строку.
ex: www.google.com
становится <a href="http://www.google.com" target="_blank">www.google.com</a>
непосредственно перед отображением на странице.
До недавнего времени это работало отлично, один из моих клиентов разместил контент с двумя ссылками из одного домена.
ссылки были, скажем,
- www.google.com / изображения / blahblah
- www.google.com
Моя проблема в том, что когда во второй раз выполняется замена строки (я использую StringBuilder.Replace
), первая ссылка также заменяется!
Итак, во-первых,
www.google.com/images/blahblah
становится
<a href="http://www.google.com/images/blahblah" target="_blank">www.google.com/image/blahblah</a>
что хорошо. Но проблема возникает при замене второй строки, так как замена глобальна, она выполняет замену уже обработанной ссылки, поэтому исходная (указанная выше) ссылка искажается, так как видит там также www.google.com .
Это так запутано, что я действительно получаю изуродованную мерзость струны.
Как мне этого избежать?
Предоставляет ли Regex.Matches
индекс совпадающего элемента, с которым я могу работать? Я нигде не мог его найти.
С чем лучше всего бороться? какие-либо предложения?
извините за длинный вопрос.
Я могу сделать это, вручную перебирая строку, но это долго и больно, должен быть хороший способ сделать это ...
edit добавление дополнительной информации по запросу:
Мое регулярное выражение:
string rPattern = @"(((http|ftp|https):\/\/)|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#!]*[\w\-\@?^=%&/~\+#])?";
Regex rLinks = new Regex(rPattern, RegexOptions.IgnoreCase);
MatchCollection matches = rLinks.Matches(inputString);
тогда я использую
foreach(Match match in matches)
{
if(match.value.StartsWith("www.youtube.com/watch"))
{
//logic to embed youtube video - this works fine.
}
}
//Here I replace all hyperlinks to their <a href> parts