Как на C# заменить ссылки в тексте исключая параметры тегов?

Нужно заменить все ссылки в тексте на тег <a href=""></a>. При этом не нужно менять ссылки, которые являются атрибутами тегов (например: <a href="http:// toster. ru/">Тостер</a> или <img src="http:// mysite. com/photo.jpg" />). (пробелы поставил т. к. Тостер врубает свой интеллект)

Пример текста:

Принцип восприятия http://google.ru непредвзято создает www.ya.ru
паллиативный интеллект, support@rambler.ru условно. Концепция
<a href="http://mail.ru">ментально</a> оспособляет
<img src="http://bing.com/images/01.jpg" /> закон внешнего мира.


Результат:

Принцип восприятия <a href="https://google.ru/">https://google.ru</a>
непредвзято создает <a href="http://www.ya.ru/">www.ya.ru</a>
паллиативный интеллект, support@rambler.ru условно. Концепция
<a href="http://mail.ru">ментально</a> оспособляет
<img src="http://bing.com/images/01.jpg" /> закон внешнего мира.


Сейчас в наличие «правдоподобный» код, который отрабатывает замену ссылок, но не знаю ка его переделать, чтобы игнорировались ссылки в атрибутах (не силен в регексах).

private static Regex regExHttpLinks = new Regex(@"(?<=\()\b(https?://|www\.)[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|](?=\))|(?<=(?<wrap>[=~|_#]))\b(https?://|www\.)[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|](?=\k<wrap>)|\b(https?://|www\.)[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|]",
	RegexOptions.Compiled | RegexOptions.IgnoreCase);

public static string ParseHtml(this string source)
{
	if (string.IsNullOrEmpty(source))
		return source;
	var periodReplacement = "[[[replace:period]]]";
	source = Regex.Replace(source, @"(?<=\d)\.(?=\d)", periodReplacement);
	var linkMatches = regExHttpLinks.Matches(source);
	foreach (Match match in linkMatches)
	{
		var m = match.ToString();
		string s = (m.Contains("://")) ? m : "http://" + m;
		source = source.Replace(m,
			String.Format("<a href=\"{0}\" title=\"{0}\">{1}</a>",
			s.Replace(".", periodReplacement).ToLower(),
			m.Replace(".", periodReplacement)));
	}
	source = source.Replace(periodReplacement, ".");
	return source;
}
  • Вопрос задан
  • 2746 просмотров
Решения вопроса 1
Добрый день.
Пробеле из-за третьего куска регулярки, который никак не проверяет контекст в котором он находится. Если добавить негативные предпросмотры вперёд на наличие тегов, то должно получится то что Вам надо.

Проверьте вот в таком варианте

(?<=\()\b(https?://|www\.)[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|](?=\))|(?<=(?<wrap>[=~|_#]))\b(https?://|www\.)[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|](?=\k<wrap>)|(?<!((a\shref=\")|(img src=")))\b(https?://|www\.)[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы