RegEx, чтобы получить href и src из содержимого HTML? - PullRequest
4 голосов
/ 09 ноября 2011

Я пытаюсь извлечь ссылки href и src из строки HTML. Согласно этому сообщению , я смог получить часть изображения.Может ли кто-нибудь помочь настроить регулярное выражение, чтобы включить URL-адрес href в коллекцию?

public List<string> GetLinksFromHtml(string content)
{
    string regex = @"<img[^>]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>";
    var matches = Regex.Matches(content, regex, RegexOptions.IgnoreCase | RegexOptions.Singleline);
    var links = new List<string>();

    foreach (Match item in matches)
    {
        string link = item.Groups[1].Value;
        links.Add(link);
    }

    return links;
}

Ответы [ 5 ]

8 голосов
/ 09 ноября 2011

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 тегов (я предполагаю, что дополнительные плакаты несколько увеличат это значение)

0 голосов
/ 01 июля 2014

Есть несколько мест, в которых можно найти ссылку и изображение.

-Link
    -href
        (?<AttributeName>(?:href))\s*=\s*["'](?<AttributeValue>(?:[^"'])*)
        for c# = (?<AttributeName>(?:href))\s*=\s*[""'](?<AttributeValue>(?:[^""'])*)

проверить здесь

-Image
    -Image_DirectSource
        -src
        -background
            (?<AttributeName>(?:src|background))\s*=\s*["'](?<AttributeValue>(?:[^"'])*)
            for c# = (?<AttributeName>(?:src|background))\s*=\s*[""'](?<AttributeValue>(?:[^""'])*)

проверить здесь

    _Image_IndirectSource   
        -style
            -background:url()
            background\s*:\s*url\s*\(\s*(?<AttributeValue>(?:[^)])*)

проверьте здесь

0 голосов
/ 17 июня 2013

Приведенный ниже код может помочь вам получить каждую ссылку в html, после получения вы можете получить более подробный элемент в ссылке:

string html = "123<a href=\"http://www.codeios.com/home.php\">123123</a>789";
Regex r = new Regex(@"<a.*?href=(""|')(?<href>.*?)(""|').*?>(?<value>.*?)</a>");

foreach (Match match in r.Matches(html))
{
    string url = match.Groups["href"].Value;
    string text = match.Groups["value"].Value;

    Response.Write(url + text);
}
0 голосов
/ 09 ноября 2011

Так чудовищно! Потому что разбор html регулярными выражениями - это зло

 <img[^>]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?href\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>
0 голосов
/ 09 ноября 2011

Я только что набросал это очень быстрое выражение Regex, но протестировано и работает, скажите мне, если это соответствует вашим потребностям. (url и img сгруппированы по именам, поэтому их будет легко найти)

<a(.*?)href="(?P<url>.*?)"(.*?)><img(.*)src="(?P<img>.*?)"(.*?)></a>

Вы также можете сделать так, чтобы он ловил изображения без ссылки, добавив? подпишите теги <a> и </a> следующим образом:

(<a(.*?)href="(?P<url>.*?)"(.*?)>)?(<img(.*)src="(?P<img>.*?)"(.*?)>)(</a>)?

Шай

...