Пример #1
0
        /// <summary>
        /// Определение индекса последнего символа ">" в двойном теге. Применяется после метода GetTagBounds().
        /// </summary>
        /// <param name="html">
        /// 
        /// </param>        
        public void ShiftLastIndex(ref string _html)
        {
            MatchCollection openTags;  // массив открывающих тегов
            MatchCollection closeTags; // массив закрывающих тегов  
            tagPairs.Clear();

            _html = string.Empty;

            if (TagName != string.Empty && !TagName.Equals("img", StringComparison.OrdinalIgnoreCase) &&
                !TagName.Equals("br", StringComparison.OrdinalIgnoreCase))
            {
                openTags = Regex.Matches(html, "<" + TagName + @"[^>]*>", RegexOptions.IgnoreCase);
                closeTags = Regex.Matches(html, "</" + TagName + ">", RegexOptions.IgnoreCase);

                // Заполняет массив пар тегов.
                if (openTags.Count > 0)
                {
                    // Начинает с первого закрывающего тега.
                    for (var i = 0; i < closeTags.Count; i++)
                    {
                        var tp = new TagPair
                        {
                            CloseTag = closeTags[i].ToString(),
                            CloseTagStartIndex = closeTags[i].Index,
                            CloseTagLastIndex = (closeTags[i].Index + closeTags[i].Length - 1)
                        };

                        // Идём навстречу с последнего открывающего.
                        for (var j = openTags.Count - 1; j >= 0; j--)
                        {
                            // Когда находит первый открывающий тег, индекс которого меньше данного закрывающего.
                            if (closeTags[i].Index > openTags[j].Index)
                            {
                                // Если открывающий тег не добавлен в другую пару.
                                if (!TagPairsContains(openTags[j].Index, openTags[j].ToString()))
                                {
                                    tp.OpenTag = openTags[j].ToString();
                                    tp.OpenTagStartIndex = openTags[j].Index;
                                    tp.OpenTagLastIndex = openTags[j].Index + openTags[j].Length - 1;
                                    tagPairs.Add(tp);
                                    break;
                                }
                            }
                        }
                        if ((tagPairs.Count == openTags.Count) | (tagPairs.Count == openTags.Count))
                        {
                            break;
                        }
                    }
                }

                foreach (var tp in tagPairs)
                {
                    if (tp.OpenTagStartIndex == OpenTagStartIndex)
                    {
                        CloseTagStartIndex = tp.CloseTagStartIndex;
                        CloseTagLastIndex = tp.CloseTagLastIndex;
                    }
                }
                _html = html;
            }
            else
            {
                CloseTagStartIndex = OpenTagStartIndex;
                CloseTagLastIndex = OpenTagLastIndex;
                _html = html;
            }
        }
        /// <summary>
        /// Определение индекса последнего символа ">" в двойном теге. Применяется после метода GetTagBounds()
        /// </summary>
        /// <param name="html">
        /// 
        /// </param>        
        public void ShiftLastIndex(ref string html)
        {
            MatchCollection openTags;  // массив открывающих тегов
            MatchCollection closeTags; // массив закрывающих тегов  
            tagPairs.Clear();

            html = string.Empty;

            if (tagName != string.Empty && !tagName.Equals("img", StringComparison.OrdinalIgnoreCase) &&
                !tagName.Equals("br", StringComparison.OrdinalIgnoreCase))
            {
                openTags = Regex.Matches(htmlText, "<" + tagName + @"[^>]*>", RegexOptions.IgnoreCase);
                //openTags = Regex.Matches(htmlText, "<" + tagName + @"(.*?)+>", RegexOptions.IgnoreCase);
                closeTags = Regex.Matches(htmlText, "</" + tagName + ">", RegexOptions.IgnoreCase);
                // заполняем массив пар тегов
                if (openTags.Count > 0)
                {
                    // начинаем с первого закрывающего тега
                    for (int i = 0; i < closeTags.Count; i++)
                    {
                        TagPair tp = new TagPair();
                        tp.CloseTag = closeTags[i].ToString();
                        tp.CloseTagStartIndex = closeTags[i].Index;
                        tp.CloseTagLastIndex = closeTags[i].Index + closeTags[i].Length - 1;
                        // идём навстречу с последнего открывающего
                        for (int j = openTags.Count - 1; j >= 0; j--)
                        {
                            // когда находим первый открывающий тег, индекс которого меньше данного закрывающего
                            if (closeTags[i].Index > openTags[j].Index)
                            {
                                // если открывающий тег не добавлен в другую пару
                                if (!TagPairsContains(openTags[j].Index, openTags[j].ToString()))
                                {
                                    tp.OpenTag = openTags[j].ToString();
                                    tp.OpenTagStartIndex = openTags[j].Index;
                                    tp.OpenTagLastIndex = openTags[j].Index + openTags[j].Length - 1;
                                    tagPairs.Add(tp);
                                    break;
                                } // if (!TagPairsContains(...
                            } // if (closeTags[i].Index ...
                        } // for (int j = ...    
                        if ((tagPairs.Count == openTags.Count) | (tagPairs.Count == openTags.Count))
                        {
                            break;
                        } // if ((tagPairs.Count == ...
                    } // for (int i = 0; ...
                } // if (openTags.Count > 0)

                foreach (TagPair tp in tagPairs)
                {
                    if (tp.OpenTagStartIndex == openTagStartIndex)
                    {
                        closeTagStartIndex = tp.CloseTagStartIndex;
                        closeTagLastIndex = tp.CloseTagLastIndex;
                    } // if (tp.OpenTagStartIndex...
                } // foreach (TagPair tp in tagPairs)
                html = htmlText;
            } //  if (tagName != string.Empty...
            else
            {
                closeTagStartIndex = openTagStartIndex;
                closeTagLastIndex = openTagLastIndex;
                html = htmlText;
            } // else
        } // ShiftLastIndex