Okie Doke! Без «лишней библиотеки» и «быстрых и легких», вот так:
<(?<Tag_Name>(a)|img)\b[^>]*?\b(?<URL_Type>(?(1)href|src))\s*=\s*(?:"(?<URL>(?:\\"|[^"])*)"|'(?<URL>(?:\\'|[^'])*)')
или в виде строки C #:
@"<(?<Tag_Name>(a)|img)\b[^>]*?\b(?<URL_Type>(?(1)href|src))\s*=\s*(?:""(?<URL>(?:\\""|[^""])*)""|'(?<URL>(?:\\'|[^'])*)')"
Это захватывает имя тега (a
или img
) в группу "Tag_Name", тип URL (href
или src
) в группу "URL_Type" и URL в группу " URL "(я знаю, я немного креативен с названиями групп).
Он обрабатывает кавычки любого типа ("
или '
), и хотя любой тип кавычек в URL-адресе уже должен быть закодирован в сущности, он будет игнорировать любые экранированные символы кавычек \'
и \"
.
Он не игнорирует незакрытые теги (поэтому искаженный HTML), он найдет отверстие для одного из тегов, таких как <a
или img
, а затем продолжит игнорировать все, кроме больше (>
) вверх пока он не найдет соответствующий тип атрибута URL (href
для тегов a
и src
для тегов img
), затем сопоставьте содержимое. Затем он завершает работу и не беспокоится об остальной части тега!
Дайте мне знать, если вы хотите, чтобы я разбил его для вас, но вот несколько примеров совпадений, которые он сделал для этой самой страницы:
<Match> 'Tag' 'URL_Type' 'URL'
---------------------------------------- ----- ---------- -----------------------------
<a href="http://meta.stackoverflow.com" a href http://meta.stackoverflow.com
<a href="/about" a href /about
<a href="/faq" a href /faq
<a href="/" a href /
<a id="nav-questions" href="/questions" a href /questions
...
<img src="/posts/8066248/ivc/d499" img src /posts/8066248/ivc/d499
Всего найдено 140 тегов (я предполагаю, что дополнительные плакаты несколько увеличат это значение)