Получить атрибут «Заголовок» из ссылки html, используя Regex - PullRequest
0 голосов
/ 12 мая 2009

У меня есть следующее регулярное выражение для сопоставления всех тегов ссылок на странице, созданной с помощью нашего пользовательского cms

<a\s+((?:(?:\w+\s*=\s*)(?:\w+|"[^"]*"|'[^']*'))*?\s*href\s*=\s*(?<url>\w+|"[^"]*"|'[^']*')(?:(?:\s+\w+\s*=\s*)(?:\w+|"[^"]*"|'[^']*'))*?)>.+?</a>

Мы используем c #, чтобы просмотреть все совпадения и добавить событие onclick для каждой ссылки (для отслеживания программного обеспечения) перед отображением содержимого страницы. Мне нужно проанализировать ссылку и добавить параметр в функцию onclick, которая является «именем ссылки».

Я собирался изменить регулярное выражение, чтобы получить следующие подгруппы

  • Атрибут заголовка ссылки
  • Если ссылка содержит тег изображения, получите альтернативный текст изображения
  • Текст ссылки

Затем я могу проверить соответствие каждой подгруппы, чтобы получить соответствующее имя ссылки.

Как бы я изменил вышеприведенное регулярное выражение, чтобы сделать это, или я мог бы достичь того же результата, используя код c #?

Ответы [ 3 ]

6 голосов
/ 12 мая 2009

Регулярные выражения в принципе плохо разбирают HTML (см. . Можете ли вы привести некоторые примеры того, почему трудно анализировать XML и HTML с регулярным выражением? , почему). Что вам нужно, это HTML-парсер. См. Можете ли вы привести пример разбора HTML с вашим любимым парсером? для примеров использования различных парсеров.

В частности, вас может заинтересовать ответ HTMLAgilityPack .

2 голосов
/ 12 мая 2009

Попробуйте это:

Regex reg = new Regex("<a[^>]*?title=\"([^\"]*?\"[^>]*?>");

Несколько ошибок:

  • Это совпадение будет чувствительно к регистру, вы можете настроить это
  • Предполагается, что атрибут title существует и указан в кавычках
    • Конечно, если атрибут title не существует, вы, вероятно, не хотите совпадения?

Чтобы извлечь, используйте коллекцию групп:

reg.Match("<a href=\"#\" title=\"Hello\">Howdy</a>").Groups[1].Value
0 голосов
/ 13 мая 2009

Благодаря Хаосу. Оуэнс за то, что указал мне на библиотеку HtmlAgilityPack, это здорово. в конце я использовал это, чтобы решить мою проблему как ниже. Я бы настоятельно рекомендовал эту библиотеку другим.

   HtmlDocument htmldoc = new HtmlDocument();
    htmldoc.LoadHtml(content);
    HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");
    if (linkNodes != null)
    {
        foreach (HtmlNode linkNode in linkNodes)
        {
            string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
            //If no title attribute exists check for an image alt tag
            if (linkTitle == string.Empty)
            {
                HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
                if (imageNode != null)
                {
                    linkTitle = imageNode.GetAttributeValue("alt", string.Empty);
                }
            }
            //If no image alt tag check for span with text
            if (linkTitle == string.Empty)
            {
                HtmlNode spanNode = linkNode.SelectSingleNode("span");
                if (spanNode != null)
                {
                    linkTitle = spanNode.InnerText;
                }
            }

            if (linkTitle == string.Empty)
            {
                if (!linkNode.HasChildNodes)
                {
                    linkTitle = linkNode.InnerText;
                }
            }

        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...