0

Есть необходимость получить все относительные пути в HTML разметке. Составил подобное регулярное выражение:

@"(?:src|href)=""([^#](?!http[s]*[:])[^/]{2}(([a-z0-9-.]*/)*)([a-z0-9-.]*?[a-z0-9-]*!?.[a-z]{2,4})(?!#)\w*\W*)"""

В целом работает как нужно, если использовать аналогичное, например в JavaScript. Якоря типа #yakor игнорируются корректно, но есть проблема с якорными ссылками типа index.html#yakor в C#, они как раз не игнорируются.

Конструировал в этом калькуляторе, но он для JavaScript.

Kromster
  • 13,809
BwehaaFox
  • 1,012

1 Answers1

2

Если проблема лишь в разборе ссылки, как сказано в комментарии, то лучше снова-таки не пытаться воспользоваться регулярками, а применить честный класс Uri.

Пример:

var uri1 = new Uri("http://www.google.com/index.html#yakor", UriKind.RelativeOrAbsolute);
var uri2 = new Uri("/index.html#yakor", UriKind.RelativeOrAbsolute);

Console.WriteLine(uri1.IsAbsoluteUri); // true
Console.WriteLine(uri2.IsAbsoluteUri); // false

А для разбора HTML лучше воспользоваться советами отсюда.

VladD
  • 206,799
  • В целом Uri упростил отсечение абсолютных путей, но пути вида //site.ru/img.jpg приходится допиливать вручную. – BwehaaFox Aug 12 '16 at 01:41
  • @BwehaaFox: А разве это валидный адрес? – VladD Aug 12 '16 at 08:12
  • Ну как мне довелось убедиться -да. Как понимаю это некая сокращенная альтернатива http:// для src и href – BwehaaFox Aug 15 '16 at 01:36