Поиск по данному слову или парам слов, не входящих в теги href - PullRequest
0 голосов
/ 10 января 2020

Я использую C# и стандартный механизм регулярных выражений. net core.

Мне нужен шаблон регулярных выражений;

Поиск по заданному слову (например, «stackoverflow») или парам слов (например: «stackoverflow сайты»), которые не находятся в тегах href / не имеют гиперссылок.

Пример:
Данное слово является "stackoverflow" (Игнорировать верхний регистр символов, нижний регистр.)

<a href="https://stackoverflow.com/">Stackoverflow</a> is very useful site to learn what causes <b>stackoverflow</b> or not.

Другой пример;

<a href="https://stackoverflow.com/">Good stackoverflow site</a> is actually very good site to learn what causes stackoverflow in software.

Мне нужно сначала поймать " stackoverflow "после слова« причины », потому что другие« Stackoverflow »(ы) гиперссылки.

То, что я пробовал до сих пор;

string regexPattern = $@"\b{wordCouple}(.*?)[^</a]\b";
Regex regex = new Regex(regexPattern, RegexOptions.IgnoreCase);

Match match = regex.Match(text);

Но это не работает. Как мне написать это регулярное выражение?

Обновление : Дополнительная информация по запросу и комментарии ;

Я не могу использовать html парсер, потому что бизнес-правил;

У меня есть упорядоченный список для гиперссылки на все слова или группы слов. Мне нужно рассмотреть все "тело html" из-за этих правил.

Правила есть; - Только 1 слово должно быть гиперссылкой для слов 1 группы. - Максимум 3 слова должны быть гиперссылки для всех групп. - Не связывайте гиперссылку слова / группы слов, если она уже гиперссылка.

Итак, вот что я попробовал;


    public class HyperlinkWordGroup
    {
        public HyperlinkWordGroup()
        {
            Words = new List();
        }

        /// 
        /// Hyperlink word group name.
        /// 
        public string Title { get; set; }

        public string Url { get; set; }

        /// 
        /// "_self": Opens the linked document in the same frame as it was clicked (this is default).
        /// or
        /// "_blank": Opens the linked document in a new window or tab.
        /// 
        public string UrlTarget { get; set; }

        public List Words { get; set; }
    }

private string ReplaceBodyAgility(string text, List group)
        {
            if (string.IsNullOrWhiteSpace(text))
            {
                return string.Empty;
            }

            const int maxHyperlinkedCount = 3;
            int count = 0;

            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(text);

            List htmlNodes = doc.DocumentNode
                                          .Descendants()
                                          .ToList();

            foreach (HtmlNode htmlNode in htmlNodes)
            {
                if (count == maxHyperlinkedCount)
                {
                    break;
                }

                if (! htmlNode.Name.Equals("#text"))
                {
                    // Load next htmlNode because we want texts not tags.
                    continue;
                }

                foreach (HyperlinkWordGroup wordGroup in group)
                {
                    foreach (string wordCouple in wordGroup.Words)
                    {
                        string regexPattern = $@"\b{wordCouple}\b";
                        Regex regex = new Regex(regexPattern, RegexOptions.IgnoreCase);

                        Match match = regex.Match(htmlNode.InnerHtml);

                        if (match.Success)
                        {
                            string link = $" {wordCouple} ";

                            htmlNode.InnerHtml = htmlNode.InnerHtml.Replace(wordCouple, link, StringComparison.InvariantCultureIgnoreCase);

                            count = count + 1;

                            break;
                        }
                    }

                    if (count == maxHyperlinkedCount)
                    {
                        break;
                    }
                }
            }

            return doc.DocumentNode.InnerHtml;
        }

Конечно, этот код не работает, потому что мне нужно учитывать порядок «Список групп». Если я запускаю эту функцию, все «$ text» в htmlagilitypack приходят соответственно, но я должен смотреть на все тело html не построчно или не htmltag htmltag.

Вот почему мне нужно регулярное выражение, чтобы найти первое слово или группу слов, которые не связаны гиперссылками.

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